Ich habe ein großes Java-Projekt und wir verwenden Maven für unseren Build-Zyklus. Dieses eine Projekt wird ausgiebig genutzt - in anderen Projekten, in verschiedenen Anwendungen, von denen einige darin enthalten sind und andere an anderer Stelle ... Um ehrlich zu sein, ist es ein bisschen chaotisch (verschiedene Bits werden zu unterschiedlichen Zeiten für bestimmte hinzugefügt) Zwecke), und ich möchte es ein wenig aufräumen. Außerdem ist es nicht vollständig getestet (viele Bits wurden ohne ordnungsgemäßen Unit- und Integrationstest hinzugefügt), und es gibt einige Tests, deren Ausführung sehr lange dauert oder die nicht erfolgreich sind ... (ähm) - also Tests werden im Maven-Build-Zyklus abgeschaltet (wieder, oh-oh).
Ich denke darüber nach, dieses große Projekt in kleinere spezifische Projekte zu unterteilen, so dass das "endgültige" Unterprojekt (oder mehrere Unterprojekte) die verschiedenen Unterprojekte aufgreift, die es benötigen würde.
Ich denke wie folgt:
- Wenn ich das große Projekt in verschiedene Unterprojekte aufteile, wird klar, wozu jedes Projekt zuständig ist.
- Durch Aufteilen in Unterprojekte kann ich dann das Testen jedes Unterprojekts einzeln bereinigen und das Testen für dieses Unterprojekt im Maven-Erstellungszyklus aktivieren.
Ich bin etwas besorgt darüber, welche Auswirkungen dies auf die Build-Zeit haben könnte.
- Würde das Auferlegen einer Struktur für das große Projekt (dh für kleinere Unterprojekte) den Compiler verlangsamen?
Ich bin auch ein wenig besorgt darüber, welche Auswirkungen dies auf die Bearbeitungszeit in IDEs haben könnte (wir verwenden hauptsächlich Intellij). Intellij scheint jedes Projekt der Reihe nach über den Abhängigkeitsbaum zu erstellen. Wenn also C von B von A abhängt und ich A ändere, wird B erst dann erstellt, wenn A kompiliert und so weiter. Das ist zwar von Vorteil, aber ich habe festgestellt, dass es einige Zeit dauert, bis alle Fehler aus dieser Änderung behoben sind, wenn ich beispielsweise eine in B und C häufig verwendete Schnittstelle in A ändere.
Eine andere Frage ist, wie Factory-Klassen verwendet werden. Einige Aspekte des Projekts hängen von externen Gläsern ab. Gelegentlich (zum Glück nicht oft) werden diese aktualisiert, und wir müssen migrieren. Wir neigen dazu, eine Factory-Klasse zu verwenden, die auf die richtigen Versionen des externen Codes verweist (damit wir nicht alle Implementierungen in der gesamten Codebasis ändern müssen).
Im Moment ist das alles in dem großen Projekt, aber ich denke, dass ich durch den Wechsel zu Unterprojekten ein neues Projekt für die Implementierung von neuem externem Code entwickeln und sicherstellen könnte, dass das Unterprojekt voll funktionsfähig und getestet ist Wechseln Sie dann die Abhängigkeiten / Factory-Klasse im Anwenderprojekt. Dies wird jedoch durch die umfangreiche Verwendung von Schnittstellen im gesamten Großprojekt erschwert. Beispielsweise
- Unterprojekt A - enthält Schnittstellen
- Unterprojekt B - hängt von A für Schnittstellen und altes externes Glas ab
- Unterprojekt C - hängt von B (und damit von A und dem alten externen Jar) ab und enthält eine Factory-Klasse, die die Schnittstellenimplementierungen von B verwendet
Wenn ich das äußere Glas von B wechseln muss, kann ich:
- Unterprojekt B_ii erstellen - hängt wieder von A und jetzt dem neuen externen Glas ab
- Sobald ich voll funktionsfähig bin, kann ich Cs Abhängigkeit zu B_ii hinzufügen und die Factory-Klasse ändern, um die neuen Implementierungen von Schnittstellen zu verwenden.
Wenn das alles funktioniert, kann ich dann Cs Abhängigkeit von Original B entfernen und, falls gewünscht, Teilprojekt B entfernen.
Ist das eine vernünftige Vorgehensweise?
Im Allgemeinen sind meine Fragen also:
- Hat jemand Erfahrung damit, große Projekte aufzubrechen? Gibt es Tipps / Tricks, die Sie gerne teilen würden?
- Welchen Einfluss hatte dies auf Ihre Entwicklungs- und Bauzeiten?
- Welchen Rat könnten Sie zur Strukturierung einer solchen Aufteilung eines solchen Projekts geben?