88 votes

Dépendance de 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 au niveau de la compilation et du module 1 tests au niveau des tests.

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 du module 1 src et qu'il est testé à la compilation.

Module 3 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>compile</scope>
   </dependency>

Quand je cours mvn clean install mon build fonctionne jusqu'au module 3, échoue au module 3 car il n'a pas pu résoudre la dépendance de test du module 1. Ensuite, je fais un mvn install sur le seul module 3, revenir en arrière et exécuter mvn install sur mon pom parent pour qu'il soit construit. Comment puis-je résoudre ce problème ?

0 votes

Pourriez-vous nous indiquer à quoi ressemble votre pom parent ?

133voto

Pascal Thivent Points 295221

J'ai un doute sur ce que vous essayez de faire mais je vais supposer 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 de la page Guide d'utilisation des tests joints :

Il est à noter que les éditions précédentes de ce guide suggéraient l'utilisation de <classifier>tests</classifier> au lieu de <type>test-jar</type> . Bien que cela fonctionne actuellement dans certains cas, cela ne fonctionne pas correctement lors d'une construction par réacteur du module JAR de test et de tout consommateur si une phase de cycle de vie antérieure à 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/éloigné. Apparemment, le JAR des dépôts pourrait être obsolète ou complètement absent, provoquant un échec de la construction (cf. MNG-2045 ).

Donc, tout d'abord, pour empaqueter les tests compilés dans un JAR et les déployer en vue d'une réutilisation générale, configurez l'option 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 la commande mvn install o 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>

3 votes

Pascal. Tout d'abord merci de répondre à toutes les questions sur maven ! En ce qui concerne cette question. J'ai encore un problème. J'ai une classe testBase dans un de mes modules de base que je veux utiliser dans tous les objets enfants. Nous avons actuellement le build maven dans notre CI. Si je ne veux pas faire d'installation ou de déploiement vers le test-jar et juste vérifier une copie fraîche du tronc et exécuter le test mvn, cela échoue, car je n'ai pas de fichier de test. Cela échoue, car je n'ai pas encore le test-jar quelque part. Je n'ai aucune idée sur la façon de gérer ce problème.

0 votes

@Roman L'exécution de l'installation est la méthode "naturelle". Mais il semble que vous ayez trouvé une solution de contournement.

0 votes

Il semble que ce soit le numéro 3559 et non le numéro 2045 qui soit le point d'achoppement à ce stade : jira.codehaus.org/browse/MNG-3559

20voto

Roman Points 1910

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

<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, comme vous le voyez ici, c'est la <phase> étiquette.

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.

Cela me convient.

1 votes

Oui, très pratique. Merci de m'avoir fait part de vos commentaires. Je suppose que l'approche déployée est meilleure uniquement lorsque vous disposez d'un annuaire d'entreprise (oui, je sais que c'est fortement recommandé). Merci @Roman

3voto

Goofy Points 141

En tant que https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html dice:

H Lorsque vous souhaitez créer une archive contenant des classes de test, vous souhaitez probablement réutiliser ces classes. Il y a deux façons de résoudre ce problème :

  1. The easy way Créer un jar attaché avec les classes de test du projet actuel et perdre ses dépendances transitives à l'échelle du test.

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

Veuillez lire cet article pour plus de détails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X