Tengo un gran proyecto de Java, y usamos Maven para nuestro ciclo de construcción. Este proyecto se usa ampliamente, en otros proyectos, en varias aplicaciones, algunas de las cuales están contenidas en él y otras en otros lugares ... Para ser honesto, es un poco desordenado (se agregaron varios bits en diferentes momentos para momentos específicos propósitos), y me gustaría limpiarlo un poco. Además, no está completamente probado (se han agregado muchos bits sin la unidad adecuada y las pruebas de integración), y hay algunas pruebas que tardan mucho tiempo en ejecutarse o en realidad no pasan ... (uh-oh), así que Las pruebas se desactivan en el ciclo de construcción de Maven (de nuevo, uh-oh).
Estoy pensando en separar este gran proyecto en proyectos específicos más pequeños, de modo que el subproyecto 'final' (o varios subproyectos) recoja los diversos subproyectos que necesitaría.
Mi pensamiento es el siguiente:
- Si separo el gran proyecto en varios subproyectos, esto deja en claro cuál es la responsabilidad de cada proyecto.
- Al separarme en subproyectos, puedo limpiar las pruebas de cada subproyecto individualmente y activar las pruebas para ese subproyecto en el ciclo de construcción de Maven.
Estoy un poco preocupado por el impacto que esto podría tener en el tiempo de construcción.
- ¿Imponer una estructura en el proyecto grande (es decir, en subproyectos más pequeños) ralentizaría el compilador?
Además, tengo una ligera preocupación sobre el impacto que esto podría tener el tiempo de edición en IDEs (principalmente utilizamos Intellij). Intellij parece construir cada proyecto a su vez a través del árbol de dependencias, es decir, si C depende de B depende de A y yo cambio A, no intentará construir B a menos que A compile, y así sucesivamente. Podría decirse que es ventajoso, pero he descubierto que si, por ejemplo, cambio una interfaz en A que se usa ampliamente en B y C, lleva algún tiempo corregir todos los errores de ese cambio ...
Otra pregunta es cómo usar las clases de fábrica. Algunos aspectos del proyecto dependen de frascos externos. Ocasionalmente (afortunadamente no con frecuencia) estos se actualizan y tenemos que migrar. Tendemos a manejar esto mediante el uso de una clase Factory que apunta a las versiones correctas del código externo (por lo que no tenemos que cambiar todas las implementaciones en toda la base de código).
Por el momento, todo esto está en el gran proyecto, pero estoy pensando que al cambiar a subproyectos, podría desarrollar un nuevo proyecto para la implementación de un nuevo código externo, asegurarme de que el subproyecto sea completamente funcional y probado, y luego cambie las dependencias / clase de fábrica en el proyecto del usuario. Sin embargo, esto se hace más complicado por el uso extensivo de interfaces en todo el gran proyecto. Por ejemplo
- subproyecto A - contiene interfaces
- subproyecto B: depende de A para las interfaces y el antiguo jar externo
- subproyecto C: depende de B (y, por lo tanto, A y jar externo antiguo), y contiene una clase Factory que utiliza las implementaciones de interfaces de B
Si necesito cambiar el frasco externo de B, puedo:
- crear subproyecto B_ii - nuevamente depende de A, y ahora el nuevo jar externo
- una vez completamente funcional, puedo agregar la dependencia de C a B_ii y cambiar la clase Factory para usar las nuevas implementaciones de interfaces.
cuando todo está funcionando, puedo eliminar la dependencia de C del B original y, si lo deseo, eliminar el subproyecto B.
¿Es esa una forma sensata de hacer esto?
Entonces, en general, mis preguntas son:
- ¿Alguien tiene alguna experiencia en la ruptura de grandes proyectos? ¿Hay algún consejo / truco que estaría dispuesto a compartir?
- ¿Qué impacto tuvo esto en su desarrollo y tiempos de construcción?
- ¿Qué consejo podría ofrecer para estructurar una ruptura de tal proyecto?