2011-07-13 16 views
11

¿Hay herramientas que describan el proceso de construcción de Maven para que pueda ver dónde está pasando más tiempo la compilación?Profiling Maven

Estamos teniendo problemas en el trabajo con respecto a Maven 3.0.3 y 3.0b1. Nuestro proyecto se construye mucho más rápido en 3.0b1 (3m30s) en comparación con 3.0.3 (9m00s). Con 3.0b1 la compilación es aproximadamente un 63% más rápida (si mis cálculos son correctos).

Intenté buscar comparaciones de rendimiento y problemas de rendimiento con respecto a Maven 3, pero no pude encontrar nada.

ACTUALIZACIÓN

he hecho un poco más investigación mirando las fuentes de Maven y esto es lo que descubrí:

Durante el uso de jconsole, vi que la mayor parte del tiempo (en 3.0.3) se gasta dentro de DefaultProjectDependenciesResolver.java. Así que descargué la fuente a 3.0b1 y 3.0.3 para ver qué está pasando. Noté que en 3.0.3 hay dos versiones de la clase. Uno está en org.apache.maven.project, mientras que el otro está en org.apache.maven. También parece que en 3.0.3, el primero está siendo utilizado. Mientras recorrer el código, vi que mayor parte del tiempo se gasta cuando se llega a esta declaración:

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

En 3.0b1, el código hace:

ArtifactResolutionResult result = repositorySystem.resolve(request); 

También he notado que es de respositorySystem el tipo RepositorySystem, y la implementación concreta es LegacyRepositorySystem. Supongo que esto se estaba utilizando mientras el Maven 3 estaba en estado beta hasta que se creó la nueva implementación. Volviendo a 3.0.3, el método collectDependencies vive en DefaultRepositorySystem.java que es parte de org.sonatype.aether.impl.internal. Esto finalmente llama a collectDependencies dentro de DefaultDependencyCollector.java que también es parte de org.sonatype.aether.impl.internal. Supongo que así es como se construye el gráfico de dependencia.

Me pregunto ahora por la estructura de nuestras dependencias. ¿Alguien ha visto este tipo de comportamiento antes?

ACTUALIZACIÓN

Hay un issue en JIRA sobre este tema, junto con una solución sugerida. He publicado los detalles como una respuesta.

ACTUALIZACIÓN

El problema se debe a la versión de éter que se utiliza en Maven 3.0.3 (1.11). La versión 1.12 de éter soluciona este problema. Revisé la fuente para maven 3.0.3 y edité el POM para cambiar la versión de éter de 1.11 a 1.12. Luego construí maven desde la fuente y reemplacé mi versión actual con la versión que construí. La reducción en los tiempos de construcción es dramática.

Si no desea compilar maven desde el código fuente, puede reemplazar las bibliotecas aether que se encuentran en el directorio lib de maven con la versión 1.12. Eso debería funcionar también.

No estoy seguro de si este cambio va a llegar a la 3.0.4, porque los desarrolladores de Maven dijeron que hay cambios de licencia que van desde el aether 1.11 al aether 1.12, por lo que todavía están discutiéndolo.

Respuesta

5

Maven es simplemente una aplicación Java simple, por lo que le sugiero que la inicie con una herramienta de creación de perfiles como YourKit o JProfiler y analice su rendimiento en tiempo de ejecución. También puede usar JVisualVM para extraer información de rendimiento del tiempo de ejecución.


Con todo, creo que los desarrolladores de Maven estarían interesados ​​en conocer esta regresión del rendimiento. Por favor, abra un ticket en el Maven Jira o colocarlas en la Maven developers list

+0

Gracias Robert! ¡Probé una versión de evaluación de JProfiler y con la ayuda de eso y jconsole descubrí dónde estaba pasando tanto tiempo! Gracias por proporcionarme un enlace a la lista de desarrolladores. ¡Publicaré mi pregunta allí! –

+1

Robert, gracias de nuevo por señalarme en la dirección correcta. Estoy comentando con [un enlace] (http://vivin.net/pub/maven-3.0.3-with-aether-1.12.zip) a una versión de maven que se ha creado con aether 1.12. –

+0

@Vivin: me alegro de que haya resuelto su problema. –

2

En cuanto a la cuestión general de perfiles de Maven construye, no es este Codehaus JIRA issue que proporciona un parche para dar salida a los tiempos de ejecución de Mojos. Desafortunadamente, todavía no se ha incluido en Maven.

Cuestiones relacionadas