Dépendance de test Maven dans un projet multi module
J'utilise maven pour construire un projet multi-modules. Mon module 2 dépend du module 1 src à la portée de la compilation et des tests du module 1 dans la portée du test.
Module 2 -
<dependency>
<groupId>blah</groupId>
<artifactId>MODULE1</artifactId>
<version>blah</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
Cela fonctionne bien. Disons que mon module 3 dépend de Module1 src et teste au moment de la compilation.
Module 3 -
<dependency>
<groupId>blah</groupId>
<artifactId>MODULE1</artifactId>
<version>blah</version>
<classifier>tests</classifier>
<scope>compile</scope>
</dependency>
Quand j'exécute mvn clean install
, MA construction s'exécute jusqu'au module 3, échoue au module 3 car elle n'a pas pu résoudre la dépendance de test du module 1. Ensuite, je fais un mvn install
sur le module 3 seul, revenez en arrière et exécutez mvn install
sur mon pom parent pour faire construire. Comment puis-je résoudre ce problème?
3 réponses
J'ai un doute sur ce que vous essayez de faire mais je suppose que vous voulez réutiliser les tests que vous avez créés pour un projet (module1) dans un autre. Comme expliqué dans la note au bas du Guide d'utilisation des tests joints :
Notez que les éditions précédentes de ce guide a suggéré d'utiliser
<classifier>tests</classifier>
au lieu de<type>test-jar</type>
. Bien que cela fonctionne actuellement dans certains cas, il ne fonctionne pas correctement pendant une construction de réacteur du module JAR de test et de tout consommateur si un cycle de vie phase avant l'installation est appelée. Dans un tel scénario, Maven ne résoudra pas le pot de test à partir de la sortie de la construction du réacteur, mais à partir du référentiel local/distant. Apparemment, le JAR des dépôts pourrait être obsolète ou complètement manquant, provoquant un échec de construction (cf. MNG-2045).
Donc, tout d'abord, pour empaqueter les tests compilés dans un JAR et les déployer pour une réutilisation générale, configurez maven-jar-plugin
comme suit:
<project>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Ensuite, installez / déployez l'artefact JAR test comme d'habitude (en utilisant mvn install
ou mvn deploy
).
Enfin, pour utiliser le pot de test, vous devez spécifier une dépendance avec un type spécifié de test-jar
:
<project>
...
<dependencies>
<dependency>
<groupId>com.myco.app</groupId>
<artifactId>foo</artifactId>
<version>1.0-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
</dependencies>
...
</project>
En ce qui concerne mon commentaire à la question Pascals, je pense avoir trouvé une réponse convenable:
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
<phase>test-compile</phase>
</execution>
</executions>
<configuration>
<outputDirectory>${basedir}\target</outputDirectory>
</configuration>
</plugin>
</plugins>
La principale différence ici, comme vous le voyez ici est le <phase>
balise.
Je vais créer le test-jar et il sera disponible dans la phase de compilation des tests et pas seulement après la phase de paquet.
Fonctionne pour moi.
Comme https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html dit:
Comment créer un pot contenant des classes de test Lorsque vous souhaitez créer un jar contenant des classes de test, vous voudrez probablement réutiliser ces classes. Il y a deux façons de résoudre ce problème:
The easy way
créez un jar attaché avec les classes de test du projet en cours et perdez ses dépendances transitives à portée de test.
The preferred way
Créer un projet séparé avec les classes de test.
Veuillez lire cet article pour plus de détails.