2015-05-09 16 views
5

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 modulo Batch)

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!

+0

Sembra che potrebbe essere necessario un heap più grande o più RAM (o entrambi). –

+0

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

+0

@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

risposta

1

CI sarebbe una risposta reale ma sembra che il tuo progetto non sia modulare come dovrebbe essere. Non costruisci l'intero progetto da zero ogni volta. Costruisci barattoli, li collaudi in diversi progetti e poi li usi come singoli elementi. Ogni progetto dovrebbe essere abbastanza piccolo e coprire solo un'area. Pensi che i build Java dicano i barattoli di sicurezza quando funzionano sul pacchetto io? Dividi e conquista: questa è l'intera idea di OOP e incapsulamento.

+0

Non è modulare come sembra, quindi il mio domanda su come potrei renderlo migliore. Devo convincere i miei compagni di squadra che la situazione attuale è dolorosa e che a lungo andare danneggerà la squadra, e che possiamo fare affidamento su un piano e fidarci che lo sforzo di refactoring varrà la pena. – youri

+0

Questa è una domanda più architettonica a cui non è possibile rispondere senza analisi complete. Almeno disegnare un diagramma di classe e vedere quali sono i collegamenti. – Alex

0

Questo potrebbe non essere così male come pensi. I progetti coinvolti con test unitari e analisi statiche richiedono un po 'di tempo.

Una società per la quale ho lavorato aveva> 1 ora di costruzione + unitàTest + CodeCover tempi di integrazione. Ciò non conta il tempo necessario per spedire l'artefatto a vSphere per il test di click-through automatico dell'installatore su 26 lingue x 8 sistemi operativi supportati.

+0

Non mi interessa il 10 'per una costruzione completa di per sé. Il problema è che dobbiamo farlo ogni volta che apportiamo un singolo cambiamento. Se modifico cose solo in ModuleX, si spera, non dovrei preoccuparmi di ModuleA o ModuleB.Non siamo mai sicuri che non spezzeremo nulla di non correlato. In realtà è il contrario. Alla fine della giornata, questi 10 minuti si sommano. Tuttavia, i moduli comuni richiedono sempre una compilazione completa, ovviamente. – youri

+0

Considera l'opportunità di impostare i lavori di compilazione con parametri in Jenkins in modo che tu possa dire allo script di compilazione di creare "modulo A" su richiesta, e quindi avere cron builds orari per build di sistema completi. Questo risolverebbe il problema di un ModuleA che vuole essere costruito e testato immediatamente, così come la necessità di supportare integrazioni complete di integrazione per la regressione e test unitari completi. Si potrebbe anche avere un target ant/msbuild separato (o qualunque cosa si stia utilizzando) nello stesso lavoro Jenkins che costruirà e testare solo quel modulo su richiesta che passa il parametro Jenkins Job allo script di compilazione. – JasonRobinson