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?
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 ^ : ')
Si vous appelez uniquement "mvn install" sans "clean", le plugin du compilateur ne compilera que les classes modifiées.
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 .
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
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.
Après avoir essayé et utilisé les conseils susmentionnés, j'ai rencontré les problèmes suivants:
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.