web-dev-qa-db-fra.com

Maven ne construit que les fichiers modifiés

Disons que j'ai une structure de module comme ci-dessous 

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

Maintenant, pour lancer le client, j’ai besoin de construire tous les modules, i.e utils, domain, client, services, parce que je charge les bocaux de tous les modules ci-dessus pour lancer définitivement le client.

Et tous les pots sont assemblés dans le module deploy. 

Ma question est la suivante: si je change quelque chose dans les services, par exemple, y at-il un moyen, lors de l’exécution d’une construction à partir de deploy maven, de reconnaître qu’il doit uniquement construire services et donc de le construire et de le déployer dans le dossier deploy?

26
user1224036

Si vous utilisez SVN et * nix, à partir du module racine

mvn install -AMD -pl $(svn st | colrm 1 8 | sed 's /.*  ' | xargs echo | sed 's- -,:-g' | sed 's ^ : ') 
5
sebasjm

Si vous appelez uniquement "mvn install" sans "clean", le plugin du compilateur ne compilera que les classes modifiées. 

21
Puce

Dans une construction multi-module, vous pouvez utiliser:

mvn -pl ChangedModule compile

à partir du module racine ne compilera que le ChangedModule donné. Le plugin compilateur ne compilera que les fichiers qui ont été modifiés. Mais il peut arriver que le module que vous avez modifié entraîne la recompilation d’un autre module dépendant du ChangedModule . Ceci peut être réalisé en utilisant les éléments suivants:

mvn -AMD -pl ChangedModule compile

où -AMD signifie crée également des personnes à charge . Cela fonctionnera sans installer tous les modules dans le référentiel local avec un mvn install .

11
khmarbaise

J'avais la même frustration et j'ai également écrit un projet à l'époque. Hélas, il n'est pas disponible, mais j'ai trouvé des personnes qui ont mis en œuvre quelque chose de similaire: 

par exemple - https://github.com/erickzanardo/maven-watcher

Il utilise nodejs et suppose un projet maven mais devrait fonctionner à la fois sous windows et sous unix. 

L'idée de mon implémentation est de surveiller les changements, puis de compiler les changements. - un peu comme nodemon

Donc par exemple

  • Quand un fichier Java change - je compile le module
  • Lorsqu'un fichier de classe ou un fichier JAR change, je fais quelque chose d'autre (par exemple, copier le fichier JAR sous Tomcat et redémarrer Tomcat).

Et les deux ne sont pas liés .. donc si la compilation Java échouait, il ne devrait y avoir aucune raison pour que le fichier jar se mette à jour .. et il est assez stable. 

Je l'ai utilisé sur un projet avec 23K fichiers .Java et cela a fonctionné sans heurts. 

Il a fallu quelques secondes au processus de surveillance pour commencer, mais il ne fonctionnait ensuite que si un changement était détecté. L’expérience était donc agréable. 

La prochaine étape que je voulais ajouter est similaire à votre support SVN - listez les fichiers modifiés et utilisez-les comme initialisation. 

Important à noter - si la compilation échoue, il sera réessayé lors de la prochaine modification. Par conséquent, si vous modifiez plusieurs fichiers JAR et que la compilation échoue tant que vous écrivez du code, le système essaiera de tout compiler à chaque changement de code jusqu'à ce qu'il soit compilé correctement. 

Si vous le souhaitez, je peux essayer de retrouver mon ancien projet, le corriger un peu et le publier. 

2
guy mograbi

Après avoir essayé et utilisé les conseils susmentionnés, j'ai rencontré les problèmes suivants:

  1. L'installation de Maven (sans nettoyage) prend encore beaucoup de temps, ce qui peut prendre 10 à 20 fois de plus pour plusieurs projets. 
  2. La solution de Sebasjm est rapide et utile (je l'utilisais depuis quelques mois), mais si vous avez plusieurs projets modifiés, les reconstruire tout le temps (si vous n'avez même rien changé) est une énorme perte de temps.

Ce qui a vraiment fonctionné pour moi, c’est de comparer les dates de modification des sources avec les modifications .jar dans un référentiel local. Et si vous ne recherchez que les fichiers modifiés par VCS (voir la réponse de sebasjm), la comparaison des dates ne prendra pas beaucoup de temps (pour moi, il était inférieur à 1 s pour 100 fichiers modifiés) . Le principal avantage d'une telle approche est la reconstruction très précise La modification de la date de modification est un peu plus qu'un script à une ligne. 

Pour ceux qui veulent l'essayer, mais trop paresseux pour écrire ce script eux-mêmes en partageant ma version: https://github.com/bugy/rebuilder (linux/windows). Il peut faire d’autres choses utiles, mais l’idée principale et l’algorithme central sont comme expliqué ci-dessus.

1
buggy