web-dev-qa-db-fra.com

Dépendance du test Maven dans un projet multi-modules

J'utilise maven pour construire un projet multi-modules. Mon module 2 dépend du module 1 src lors 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. Supposons que mon module 3 dépend du module1 src et des tests 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 je lance mvn clean install, ma build 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 le faire construire. Comment puis-je réparer cela?

79
user209947

J'ai un doute sur ce que vous essayez de faire, mais je suppose que vous souhaitez 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 suggéraient 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 lors de la construction d'un réacteur du module JAR de test et de tout consommateur si une phase de cycle de vie avant l'installation est invoquée. Dans un tel scénario, Maven ne résoudra pas le JAR de test à partir de la sortie de la construction du réacteur mais à partir du référentiel local/distant. Apparemment, le JAR des référentiels pourrait être obsolète ou complètement manquant, provoquant un échec de construction (cf. MNG-2045 ).

Donc, tout d'abord, pour regrouper les tests compilés dans un JAR et les déployer pour une réutilisation générale, configurez le 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 de test comme d'habitude (en utilisant mvn install ou mvn deploy).

Enfin, pour utiliser le JAR 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>
116
Pascal Thivent

En ce qui concerne mon commentaire à la question de Pascals, je pense avoir trouvé une réponse appropriée:

<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> tag.

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 package.

Travaille pour moi.

17
Roman

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 voulez créer un pot contenant des classes de test, vous voudrez probablement réutiliser ces classes. Il existe deux façons de résoudre ce problème:

  1. The easy way Créez un pot attaché avec les classes de test du projet en cours et perdez ses dépendances de portée de test transitives.

  2. The preferred way Créez un projet séparé avec les classes de test.

Veuillez lire cet article pour plus de détails.

2
Goofy