2011-07-13 16 views
11

Esistono strumenti che descrivono il processo di generazione Maven stesso in modo che sia possibile vedere dove la spesa trascorre la maggior parte del tempo?Profiling Maven

Abbiamo problemi sul lavoro rispetto a Maven 3.0.3 e 3.0b1. Il nostro progetto è molto più veloce in 3.0b1 (3m30s) rispetto a 3.0.3 (9m00s). Con 3.0b1 la build è circa il 63% più veloce (se la mia matematica è giusta).

Ho provato a cercare i confronti delle prestazioni e le prestazioni relative a Maven 3, ma non sono riuscito a trovare nulla.

UPDATE

ho fatto qualche ricerca, cercando in fonti Maven e questo è quello che ho scoperto:

Durante l'utilizzo JConsole, ho visto che la maggior parte del tempo (in 3.0.3) viene speso all'interno di DefaultProjectDependenciesResolver.java. Quindi ho scaricato l'origine sia su 3.0b1 che su 3.0.3 per vedere cosa sta succedendo. Ho notato che nella 3.0.3 ci sono due versioni della classe. Uno è in org.apache.maven.project, mentre l'altro è in org.apache.maven. Sembra anche che nella 3.0.3, il primo venga usato. Mentre passo attraverso il codice, ho visto che la maggior parte del tempo viene speso quando raggiunge questa dichiarazione:

node = repoSystem.collectDependencies(session, collect).getRoot(); 

Nel 3.0b1, il codice fa:

ArtifactResolutionResult result = repositorySystem.resolve(request); 

Ho anche notato che respositorySystem è di il tipo RepositorySystem e l'implementazione concreta è LegacyRepositorySystem. Suppongo che questo sia stato usato mentre il Maven 3 era in beta fino a quando non è stata creata la nuova implementazione? Tornando alla 3.0.3, il metodo collectDependencies risiede in DefaultRepositorySystem.java che fa parte di org.sonatype.aether.impl.internal. Questo alla fine chiama collectDependencies all'interno di DefaultDependencyCollector.java che fa anche parte di org.sonatype.aether.impl.internal. Suppongo che questo è il modo in cui è costruito il grafico delle dipendenze.

Ora mi sto chiedendo perché sono strutturate le nostre dipendenze. Qualcuno ha mai visto questo tipo di comportamento prima?

UPDATE

C'è un issue in JIRA su questo problema insieme ad una correzione suggerita. Ho pubblicato i dettagli come risposta.

UPDATE

Il problema è dovuto alla versione di etere che viene utilizzato in Maven 3.0.3 (1.11). La versione 1.12 di etere risolve questo problema. Ho controllato il codice sorgente di Maven 3.0.3 e modificato il POM per modificare la versione di etere da 1.11 a 1.12. Ho quindi creato Maven dal sorgente e ho sostituito la mia versione corrente con la versione che ho creato. La riduzione dei tempi di costruzione è drammatica.

Se non si desidera creare Maven dal sorgente, è possibile sostituire le librerie di etere che si trovano nella directory lib di maven con la versione 1.12. Anche questo dovrebbe funzionare.

Non sono sicuro che questo cambiamento lo trasformi in 3.0.4, perché gli sviluppatori esperti hanno affermato che ci sono cambiamenti di licenza che vanno dall'etere 1.11 all'etere 1.12, e quindi stanno ancora discutendo.

risposta

5

Maven è solo una semplice applicazione Java, quindi suggerisco di avviarlo con uno strumento di profilatura come YourKit o JProfiler e analizzare le sue prestazioni di runtime. È inoltre possibile utilizzare JVisualVM per estrarre informazioni sulle prestazioni di runtime.


Tutto sommato, credo che gli sviluppatori Maven sarebbero interessati a scoprire questa regressione delle prestazioni. Si prega di aprire un ticket nel Maven Jira o inviate sul Maven developers list

+0

Grazie Robert! Ho provato una versione di valutazione di JProfiler e con l'aiuto di quello e jconsole è stato il modo in cui ho scoperto dove passava così tanto tempo! Grazie per avermi fornito un link all'elenco degli sviluppatori. Pubblicherò la mia domanda lì! –

+1

Robert, grazie ancora per avermi indicato nella giusta direzione. Sto commentando con [un collegamento] (http://vivin.net/pub/maven-3.0.3-with-aether-1.12.zip) a una versione di Maven che è stata costruita con etere 1.12. –

+0

@Vivin - felice di vedere che hai risolto il problema. –

2

Per quanto riguarda la questione generale della profilazione Maven costruisce, c'è questa Codehaus JIRA issue che fornisce una patch per l'output tempi di esecuzione dei Mojos. Sfortunatamente, non è ancora stato incluso in Maven.