web-dev-qa-db-fra.com

Comment exclure un module d'une construction de réacteur Maven?

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?

88
kayahr

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

71
SaM

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

120
Yogesh_D

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
42
Jörn Horstmann

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>
20
artbristol

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>
7
Jörn Horstmann

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.

1
Nr9