2015-05-09 7 views
5

Wir haben ein großes Java 8 Spring Hibernate Maven Projekt, das immer größer wird.Java Projekt wird zu groß

Probleme:

  • Bauzeit ist 10-12 besten Minuten; 3 Minuten ohne
  • Tests, die wir bereits einen Befehlszeilenschalter müssen selten geändert Module zu überspringen, das ist das Symptom des Build-Prozesses zu erreichen praktische Grenzen
  • Eclipse kämpfen, um das Projekt zu verwalten (obwohl IntelliJ für jetzt in Ordnung ist)
  • Die Dinge werden schlimmer, wenn das Projekt wächst und mehr Szenarien vom Testteam als Integrationstests in die Codebasis integriert werden.

Wie wir arbeiten jetzt

  • Das Projekt in etwa 20 Maven Module konfiguriert ist, etwa so:
 
    Parent 
    |--- Tier1 
    |--- Tier2 
    |--- WebTier 
     |---- ModuleA 
     |---- ModuleB 
     |---- ModuleC 
     |---- ... 
     |---- Entities 
     |---- Shared 
     |---- Batch 
     |---- IntegrationTests 
  • Die Anwendung als einzelne WAR gebaut
  • Entwickler implementieren eine einzelne Tier (typical y WebTier) als ein Artefakt von Eclipse oder IntelliJ zu ihrem lokalen Tomcat
  • Obwohl das Projekt in Modulen gut aufgeteilt scheint, gibt es viele unerwünschte Kopplungspunkte zwischen ihnen. Speziell in Shared, wo Module "cross-Module" Zugriff setzen ihre Dienste
  • Alle Integrationstests sind in einem eigenen Modul (keine Ahnung warum)

Ideen machen es besser

    benötigen
  • Fügen Sie ein MessageBroker Modul hinzu, um gegebenenfalls eine lose Kopplung zu ermöglichen. Vielleicht JMS oder einfach eine dumme In-Memory-Komponente für die synchrone Kommunikation
  • des Shared Modul Befreien Sie
  • Stellen Sie sicher, Module hat grobkörnigen Eintrag Punkte
  • entfernen unerwünschte Kopplung zwischen Geschwistern und bevorzugt den Nachrichten-Broker, wenn möglich
  • Könnte halten Entities. Zumindest die Kerngeschäftseinheiten (Customer, CustomerFile, ...). Aber einige Unternehmen gehören offenbar zu einem einzigen Modul (eine Batch-Ausführung Info im Batch Modul sein würde)

So jemand eine Änderung an ModuleA machen würde die meiste Zeit nur bauen und laufen Tests in diesem Modul ohne Angst, die Anwendung zu brechen.

Fragen

  • Heißt das, wie ein guter Plan zu sein?Mit gutem, ich meine zukunftssicher, mit guten Chancen, Dinge zu verbessern, und keine übermäßige Menge an Arbeit angesichts der Situation
  • Sollten wir 1 Eclipse/IJ Projekt pro Tier haben, lassen Sie die IDE das Artefakt bauen und bereitstellen zu Tomcat, oder sollten wir 1 Projekt pro Modul und Abhängigkeiten zu Nexus haben? Oder vielleicht ist die letztere Option übertrieben?
  • Irgendwelche anderen Vorschläge?

Einige Metriken

  • Windows 7, Java 8, Maven 3.0.3, TestNG.
  • SSD oder HDD 7200rpm (begrenzte Auswirkungen)
  • 6 Gb RAM
  • Heap 1Gb (Maven)
  • CI mit Jenkins

Dank einem Haufen!

+0

Es klingt, als ob Sie entweder einen größeren Heap oder mehr RAM (oder beides) benötigen. –

+0

Können Sie etwas mehr Informationen über die Größe des Projekts geben? Wirklich nur 20 Maven Module und nehmen 10-13 Minuten Bauzeit (klingt extrem langsam). Wie viele Tests laufen? Wie lange dauern die Tests? Welche Maven Version verwendest du? Wie viele Codezeilen (Messen mit SonarQube?) Führen Sie eine CI-Lösung wie jenkins aus? Über welche Art von Befehlszeilenschalter sprichst du? Haben Sie eine dedizierte Build-Maschine? Wie viele RAM/CPU usw. und welche Art von Festplatte hat diese Maschine? Wie viel RAM/CPU haben die arbeitenden Stationen? Welches Betriebssystem? – khmarbaise

+0

@khmarbaise Der Befehlszeilenschalter ist juste ein '-DskipSomeModules', das einem maven-Profil entspricht, um einige der selten verwendeten Module zu überspringen. Nichts besonderes hier, nur eine Eigenart, die zeigt, dass wir es nicht richtig machen IMO. Wir haben CI mit Jenkins, aber es scheint hier irrelevant zu sein: Es ist die lokale Entwicklung des Devs, die weh tut, und es kann nur durch den Aufbau des gesamten WAR durch häufiges Koppeln erreicht werden. Ich melde mich morgen mit den angeforderten Informationen bei Ihnen. Vielen Dank. – youri

Antwort

1

CI wäre eine echte Antwort, aber es sieht so aus, als ob Ihr Projekt nicht modular ist, wie es sein sollte. Sie bauen nicht jedes Mal ein komplettes Projekt von Grund auf neu. Sie bauen Gläser, testen sie in verschiedenen Projekten und verwenden sie dann als einzelne Elemente. Jedes Projekt sollte klein genug sein und nur ein Gebiet abdecken. Glauben Sie, dass Java-Builds Sicherheitsjars erstellen, wenn sie am io-Paket arbeiten? Teilen und überwinden - das ist die Idee von OOP und Kapselung.

+0

Nicht so modular wie es scheint, also meine Frage, wie ich es besser machen könnte. Ich muss meine Teamkollegen davon überzeugen, dass die derzeitige Situation schmerzhaft ist und dem Team auf lange Sicht schaden wird und dass wir uns auf einen Plan verlassen können und darauf vertrauen können, dass sich der Refactoring-Aufwand lohnt. – youri

+0

Dies ist eine architektonische Frage, die ohne vollständige Analysen nicht beantwortet werden kann. Zeichnen Sie zumindest ein Klassendiagramm und sehen Sie, welche Verbindungen es sind. – Alex

0

Dies ist möglicherweise nicht so schlimm, wie Sie denken. Involvierte Projekte mit Komponententests und statischen Analysen dauern eine Weile.

Eine Firma, für die ich gearbeitet habe, hatte> 1 Std Build + UnitTest + CodeCoverage Integrationszeiten. Die Zeit, die für den Versand des Artefakts an vSphere erforderlich ist, wird nicht gezählt, um automatisierte Clickthrough-Tests des Installationsprogramms auf 26 Sprachen x 8 unterstützten Betriebssystemen durchzuführen.

+0

Ich habe nichts gegen die 10 'für einen kompletten Build per se. Das Problem ist, dass wir es jedes Mal tun müssen, wenn wir eine einzige Änderung vornehmen. Wenn ich nur Dinge in ModuleX modifiziere, sollte ich mich hoffentlich nicht um ModuleA oder ModuleB kümmern müssen.Wir sind niemals zuversichtlich, dass wir nichts unzusammenhängendes brechen werden. Das Gegenteil ist der Fall. Am Ende des Tages summieren sich diese 10 Minuten. Gemeinsame Module erfordern jedoch immer einen vollständigen Build. – youri

+0

Sie sollten parametrisierte Build-Jobs in Jenkins einrichten, damit Sie dem Build-Skript mitteilen können, dass bei Bedarf "Modul A" erstellt wird, und stündliche Cron-Builds für vollständige System-Builds erstellt werden. Dies würde das Problem eines Entwicklers lösen, der möchte, dass ModuleA sofort gebaut und getestet wird, sowie die Notwendigkeit, vollständige Integrations-Builds für Regressions- und komplette Komponententests zu unterstützen. Sie könnten auch ein separates ant/msbuild-Ziel (oder was auch immer Sie verwenden) im selben Jenkins-Job haben, der nur dieses Modul bei Bedarf erzeugt und unit test, welches den Jenkins-Job-Parameter an das Build-Skript übergibt. – JasonRobinson