Abbiamo un grande progetto Java 8 Spring Hibernate Maven che si sta ingrandendo.Progetto Java che diventa troppo grande
Problemi:
- tempo di compilazione è 10-12 minuti al meglio; 3 minuti senza prove
- Abbiamo già un commando da riga di comando per saltare i moduli modificati raramente, che è il sintomo del processo di costruzione che raggiunge limiti pratici
- Eclipse sta faticando a gestire il progetto (anche se IntelliJ è ok per ora)
- Le cose stanno peggiorando man mano che il progetto cresce e dal momento che più scenari del team di test vengono integrati come test di integrazione nel codice base.
Come lavoriamo ora
- Il progetto è configurato in circa 20 moduli Maven, in questo modo:
Parent |--- Tier1 |--- Tier2 |--- WebTier |---- ModuleA |---- ModuleB |---- ModuleC |---- ... |---- Entities |---- Shared |---- Batch |---- IntegrationTests
- L'applicazione è costruita come una singola GUERRA
- Gli sviluppatori distribuiscono un singolo livello (tipicall y
WebTier
) come artefatto da Eclipse o IntelliJ al loro Tomcat locale - Anche se il progetto sembra diviso in modo graduale nei moduli, ci sono molti punti di accoppiamento indesiderati tra di loro. Specialmente in
Shared
, in cui i moduli che necessitano di "cross-moduli" accesso mettono i loro servizi - Tutti i test di integrazione sono in un modulo dedicato (idea del perché)
idee per rendere meglio
- Aggiungere un modulo
MessageBroker
per consentire l'accoppiamento lento, se del caso. Forse JMS, o semplicemente un componente muto in memoria per la comunicazione sincrona - Sbarazzarsi del modulo
Shared
- Assicurarsi che i moduli hanno a grana grossa punti di entrata
- Rimuovere accoppiamento indesiderato tra fratelli e preferiscono il broker messaggio quando possibile
- Potrebbe mantenere
Entities
. Almeno le entità del core-business (Cliente, CustomerFile, ...). Ma alcune entità, ovviamente, appartengono ad un singolo modulo (Info esecuzione lotto sarebbe nel moduloBatch
)
In questo modo, chiunque fare un cambiamento per ModuleA
sarebbe il più delle volte solo costruire e eseguire i test in quel modulo senza temendo di rompere l'applicazione.
Domande
- Ti sembra come un buon piano?Per buono intendo a prova di futuro, con buone possibilità di migliorare le cose, e non richiedendo una quantità eccessiva di lavoro data la situazione
- Se avessimo 1 progetto Eclipse/IJ per livello, lascia che l'IDE costruisca il manufatto e lo distribuisca a Tomcat, o dovremmo avere 1 progetto per modulo e dipendenze verso Nexus? O forse la seconda opzione è eccessiva?
- Altri suggerimenti?
Alcune metriche
- di Windows 7, Java 8, Maven 3.0.3, TestNG.
- SSD o HDD 7200rpm (impatto limitato)
- 6Gb di RAM
- Heap 1Gb (Maven)
- CI con Jenkins
Grazie un mazzo!
Sembra che potrebbe essere necessario un heap più grande o più RAM (o entrambi). –
Puoi dare qualche informazione in più sulla dimensione del progetto? In realtà solo 20 moduli Maven e impiegano 10-13 minuti di tempo di costruzione (sembra estremamente lento). Quanti test sono in esecuzione? Quanto durano i test? Quale versione di Maven stai usando? Quante righe di codice (misura di SonarQube?) Stai utilizzando una soluzione CI come jenkins? Su che tipo di interruttore di linea di comando stai parlando? Hai una macchina di sviluppo dedicata? Quante RAM/CPU ecc. E che tipo di disco ha questa macchina? Quanta RAM/CPU hanno le stazioni di lavoro hanno? Quale sistema operativo? – khmarbaise
@khmarbaise L'interruttore della riga di comando è juste a '-DskipSomeModules' che corrisponde a un profilo maven per saltare alcuni dei moduli usati raramente. Niente di speciale qui, solo una stranezza che mostra che non lo stiamo facendo bene. IMO. Abbiamo CI con Jenkins ma sembra irrilevante qui: è la build di dev locale che fa male, e può essere fatto solo costruendo la WAR completa a causa del frequente accoppiamento. Tornerò da te con le informazioni richieste domani. Grazie. – youri