Passer un sous-module au cours d'une build Maven
-
25-10-2019 - |
Question
Nous avons besoin de pouvoir sauter un sous-module dans certains environnements.
Le module en question contient des tests d'intégration et prend une demi-heure à courir. Nous voulons donc l'inclure lors de la construction sur le serveur de CI, mais quand les développeurs à créer localement (et les tests pour la course), nous voulons ignorer ce module.
Est-il possible de le faire avec un paramètre de profil? Je l'ai fait googling et regardé les autres questions / réponses ici et n'ai pas trouvé une bonne solution.
Je suppose que d'une option est de supprimer cette sous-module de la pom.xml
mère tout à fait, et juste ajouter un autre projet sur notre serveur de CI à construire juste ce module.
Suggestions?
La solution
Bien sûr, cela peut être fait en utilisant des profils. Vous pouvez faire quelque chose comme ce qui suit dans votre pom.xml parent.
...
<modules>
<module>module1</module>
<module>module2</module>
...
</modules>
...
<profiles>
<profile>
<id>ci</id>
<modules>
<module>module1</module>
<module>module2</module>
...
<module>module-integration-test</module>
</modules>
</profile>
</profiles>
...
Dans votre CI, vous courrais maven avec le profil de ci
, à savoir mvn -P ci clean install
Autres conseils
Version Maven 3.2.1 a ajouté cette fonctionnalité, vous pouvez utiliser le commutateur -pl
( raccourci pour la liste --projects
) avec !
ou -
( la source ) pour exclure certains sous-modules.
mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install
Soyez prudent dans bash le caractère! est un caractère spécial, vous avez soit guillemet simple, il (comme je l'ai fait) ou de l'évasion avec le caractère anti-slash.
La syntaxe pour exclure le module multiple est le même que l'inclusion
mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install
EDIT Windows ne semble pas comme les guillemets simples, mais il est nécessaire bash; dans Windows, utilisez des guillemets doubles (@awilkinson merci)
mvn -pl "!submodule1,!submodule2" install
Il est possible de décider quels projets réacteur à construire en spécifiant l'argument de ligne de commande -pl
:
$ mvn --help
[...]
-pl,--projects <arg> Build specified reactor projects
instead of all projects
[...]
Il accepte une liste séparée par des virgules des paramètres dans l'une des formes suivantes:
- chemin relatif du dossier contenant le POM
-
[groupId]:artifactId
Ainsi, compte tenu de la structure suivante:
project-root [com.mycorp:parent]
|
+ --- server [com.mycorp:server]
| |
| + --- orm [com.mycorp.server:orm]
|
+ --- client [com.mycorp:client]
Vous pouvez spécifier la ligne de commande suivante:
mvn -pl .,server,:client,com.mycorp.server:orm clean install
pour tout construire. Supprimer des éléments dans la liste pour ne construire que les modules que vous s'il vous plaît.
EDIT: comme blackbuild a souligné, dans Maven 3.2.1 vous avez un nouveau drapeau -el
qui exclut les projets du réacteur, similaire à ce qui fait -pl
:
La notion de projets multi-module est là pour répondre aux besoins des segments de codépendance d'un projet. client Un tel dépend des services qui dépendent à leur tour EJB dire ou routines d'accès aux données. Vous peut groupe vos tests d'intégration continue (CI) de cette manière. Je rationaliseraient en disant que les tests de CI doivent être en lock-étape avec des changements logiques d'application.
Supposons que votre projet est structuré comme:
project-root
|
+ --- ci
|
+ --- client
|
+ --- server
Le project-root/pom.xml
définit modules
<modules>
<module>ci</module>
<module>client</module>
<module>server</module>
</modules>
Les profils définit des ci/pom.xml
tels que:
...
<profiles>
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</profile>
<profile>
<id>CI</id>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
</profile>
</profiles>
Cela se traduira par des tests sauter Maven dans ce module, sauf lorsque le profil nommé CI
est actif.
Votre serveur CI doit être chargé d'exécuter mvn clean package -P CI
. Le site Web Maven a explication approfondie du mécanisme de profilage .
il est maintenant (de 1.1.1 Version) un drapeau 'sauter' dans le puits.
Vous pouvez faire des choses comme:
<profile>
<id>pit</id>
<build>
<plugins>
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</profile>
dans votre module, et la fosse sautera
[INFO] --- pitest-maven: 1.1.3: mutationCoverage (default-cli) @ module sélénium --- [INFO] projet Skipping