Nous avons un projet Maven 2 avec beaucoup de modules. Exemple:
<modules>
<module>common</module>
<module>foo</module>
<module>data</module>
<module>bar</module>
... more ...
</module>
Supposons que la construction du module "données" prenne beaucoup de temps et que nous souhaitons l'exclure lorsque le projet est construit par un serveur CI. Actuellement, nous utilisons deux fichiers pom.xml pour y parvenir. L'un contient tous les modules et l'autre tous les modules sauf ceux qui peuvent être laissés de côté pour CI. Mais c’est assez gênant car nous oublions parfois de mettre un nouveau module dans les fichiers les deux.
Existe-t-il une solution qui ne nécessite pas deux listes de modules distinctes?
Le plus simple pourrait être d'utiliser profiles
comme ceci:
<project>
...
<modules>
<module>common</module>
<module>foo</module>
<module>bar</module>
<modules>
...
<profiles>
<profile>
<id>expensive-modules-to-build</id>
<modules>
<module>data</module>
</modules>
</profile>
</profiles>
</project>
Vous devriez alors vérifier façons dont vous pouvez activer les profils
Avec Maven 3.2.1, vous pouvez maintenant utiliser -pl !<module_name>,!<module_name>
pour exclure certains modules de la construction du réacteur.
Voir cette demande de fonctionnalité: https://issues.Apache.org/jira/browse/MNG-52
Les projets à construire peuvent également être spécifiés sur la ligne de commande mvn. Cela supprime la nécessité d'un pom séparé, mais vous devrez plutôt modifier la configuration du CI à chaque fois qu'il y a un nouveau module.
-pl,--projects <arg> Comma-delimited list of specified
reactor projects to build instead
of all projects. A project can be
specified by [groupId]:artifactId
or by its relative path.
Peut-être une combinaison de ce drapeau et de --also-make-dependents
ou --also-make
réduirait encore ce fardeau de maintenance.
-am,--also-make If project list is specified, also
build projects required by the
list
-AMD,--also-make-dependents If project list is specified, also
build projects that depend on
projects on the list
Je suppose que vous voulez que la version par défaut construise toujours tout, quelle que soit la vitesse, afin que les nouveaux développeurs puissent démarrer rapidement sans avoir à comprendre grand-chose du POM. Vous pouvez utiliser des profils comme celui-ci:
<modules>
<module>common</module>
<module>foo</module>
<module>bar</module>
</modules>
...
<profiles>
<profile>
<id>expensive-modules-to-build</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<modules>
<module>data</module>
</modules>
</profile>
</profiles>
</project>
Le problème, c’est que si un développeur spécifie un autre profil sur la ligne de commande, le fichier expensive-modules-to-build
n'est pas inclus (à moins que le développeur ne le spécifie également). Cela complique la tâche de se rappeler quels profils doivent être inclus.
Voici un moyen hacky de contourner cela. Les deux profils sont toujours inclus, car le fichier pom.xml existe toujours. Donc, pour exclure les modules coûteux, vous pouvez utiliser -P!full-build
sur la ligne de commande.
<profiles>
<profile>
<id>full-build</id>
<activation>
<file>
<exists>pom.xml</exists>
</file>
</activation>
<modules>
<module>data</module>
</modules>
</profile>
<profile>
<id>short-build</id>
<activation>
<file>
<exists>pom.xml</exists>
</file>
</activation>
<modules>
<module>common</module>
<module>foo</module>
<module>bar</module>
</modules>
</profile>
</profiles>
Une autre idée: les modules Reactor peuvent être imbriqués, il devrait donc être possible de regrouper vos modules de construction lente et lente dans des poms distincts, puis d'ajouter un autre pom agrégateur contenant ces deux modules. Votre serveur CI ne peut alors que référencer le pom contenant les modules de construction rapide.
<artifactId>fast</artifactId>
<modules>
<module>fast-a</module>
<module>fast-b</module>
<module>fast-c</module>
</module>
<artifactId>all</artifactId>
<modules>
<module>fast</module>
<module>slow</module>
</module>
Vous pourriez utiliser maven profiles . Dans notre environnement de construction, nous avons créé un profil quick
qui désactive de nombreux plugins et exécute des tests.
Ceci est fait par
<profile>
<id>quick</id>
<properties>
<skipTests>true</skipTests>
<!-- others... -->
</properties>
<build>
<plugins>
<!-- configuration... -->
</plugins>
</build>
</profile>
Et puis nous invoquons maven de la manière suivante
mvn groupId:artifactId:goal -P quick
Vous pourriez peut-être désactiver la compilation et les autres plug-ins standard dans le pom de votre module pour l'accélérer.