Maven construyendo solo archivos modificados


Digamos que tengo una estructura de módulo como la siguiente

     Modules
       ->utils
       ->domain
       ->client
       ->services
       ->deploy (this is at the module level)

Ahora para lanzar el cliente necesito hacer una compilación de todos los módulos, i.e utils, domain, client, services, porque estoy cargando los jars de todos los módulos anteriores para lanzar el cliente

Y todos los jars se ensamblan en el módulo deploy.

Mi pregunta es si cambio algo en servicios, por ejemplo, entonces hay una manera cuando se ejecuta una compilación desde deploy maven podría reconocer que solo tiene que compilar services y, por lo tanto, compilarlo e implementarlo en implementar carpeta?

Author: Mallikarjuna Reddy, 2013-03-14

6 answers

Si está utilizando SVN y *nix, desde el módulo raíz

mvn install -amd -pl $(svn st | colrm 1 8 | sed 's /.*  ' | xargs echo | sed 's- -,:-g' | sed 's ^ : ') 
 5
Author: sebasjm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-24 17:40:31

Si solo llamas a "mvn install" sin "clean", el plugin compilador compilará solo clases modificadas.

 18
Author: Puce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-02 14:25:26

Dentro de una compilación de módulos múltiples puede usar:

mvn -pl ChangedModule compile

Desde el módulo raíz compilará solo el ChangedModule dado. El complemento del compilador solo compilará los archivos que se hayan cambiado. Pero puede suceder que el módulo que ha cambiado cause una recompilación de otros módulos que dependen del ChangedModule. Esto se puede lograr utilizando lo siguiente:

mvn -amd -pl ChangedModule compile

Donde-amd significa también hacer dependientes. Esto funcionará sin instalando los módulos completos en el repositorio local mediante una instalación mvn .

 10
Author: khmarbaise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-14 12:55:00

Tuve la misma frustración y también escribí un proyecto en ese momento-por desgracia no está disponible, pero encontré personas que implementaron algo similar:

Por ejemplo - https://github.com/erickzanardo/maven-watcher

Utiliza nodejs y asume un proyecto maven pero debería funcionar tanto en windows como en unix.

La idea de mi implementación es observar los cambios y luego compilar lo que cambió. - algo así como nodemon.

Así que para ejemplo

  • Cuando un archivo java cambia - Compilo el módulo
  • Cuando un archivo de clase o jar cambia, hago otra cosa (por ejemplo, copio el jar bajo tomcat y reinicio tomcat)

Y los dos no están relacionados.. por lo tanto, si la compilación java falla, no debería haber ninguna razón para que el archivo jar se actualice.. y es bastante estable.

Lo he usado en un proyecto con archivos 23K .java y funcionó sin problemas.

Tomó el proceso de reloj un par de segundos para comenzar , pero solo se ejecutaría si se detectaba un cambio, por lo que la experiencia general fue agradable.

El siguiente paso que pretendía añadir es similar a su soporte SVN - listar los archivos modificados y usarlos como inicialización.

Importante tener en cuenta - si la compilación falla, volverá a intentarlo en la siguiente modificación. así que si está modificando varios jars, y la compilación falla mientras esté escribiendo código, volverá a intentar compilar todo en cada cambio de código hasta que compilado con éxito.

Si quieres puedo intentar encontrar mi antiguo proyecto, arreglarlo un poco y publicarlo..

 2
Author: guy mograbi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-20 12:00:59

Después de probar y usar los consejos antes mencionados, he encontrado los siguientes problemas:

  1. Maven install (sin clean) todavía lleva mucho tiempo, que para varios proyectos puede ser de 10 a 20 segundos de tiempo extra.
  2. La solución de Sebasjm es rápida y útil (la estuve usando durante un par de meses), pero si tienes varios proyectos cambiados, reconstruirlos todo el tiempo (si incluso no has cambiado nada) es una gran pérdida de tiempo

Lo que realmente funcionó para mí es comparar la fuente fechas de modificación contra .modificación del jar en el repositorio local. Y si solo comprueba los archivos cambiados de VCS (consulte la respuesta de sebasjm), la comparación de fechas no tomará un tiempo notable (para mí fue menos de 1s por 100 archivos cambiados). El principal beneficio de tal enfoque es la reconstrucción muy precisa de solo proyectos realmente cambiados. El problema principal es hacer la comparación de fecha de modificación es un poco más que un script de línea.

Para aquellos, que quieren probarlo, pero demasiado perezosos para escribir tal script ellos mismos compartir mi versión: https://github.com/bugy/rebuilder (linux / windows). Puede hacer algunas cosas útiles adicionales, pero la idea principal y el algoritmo central es como se explicó anteriormente.

 1
Author: buggy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-24 11:59:31

Para GIT

mvn install -amd -pl $(git status | grep -E "modified:|deleted:|added:" | awk '{print $2}' | cut -f1 -d"/")

O

En tu .bashrc file (.bashrc se puede encontrar en el directorio home~/.bashrc) añade la siguiente función.

mvn_changed_module(){
        mvn install -amd -pl $(git status | grep -E "modified:|deleted:|added:" | awk '{print $2}' | cut -f1 -d"/")
}


Luego, después de reiniciar su bash (símbolo del sistema), puede usar el siguiente comando desde el directorio RAÍZ.

Smilyface @ machine > MainDir] mv mvn_changed_module install


Cómo funciona?
Según Question mvn install -amd -pl services es el comando cuando "algunos cambios realizados en el módulo services". Por lo tanto, primero obtenga el nombre del módulo del archivo(s) cambiado (s) y póngalo como entrada para mvn-install command

Por ejemplo, , a continuación se muestra una lista de archivos modificados (salida de git status) -
servicios/pom.xml
servicios/ReadMe.txt
services / src / java / com / some / Name.java
Entonces services es el nombre del módulo que necesita ser build / compile / install

 1
Author: smilyface,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-23 17:17:38