Dépendance de test Maven dans un projet multi-module

86

J'utilise maven pour construire un projet multi module. Mon module 2 dépend du module 1 src à la portée de compilation et des tests du module 1 dans la portée de test.

Module 2 -

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

Cela fonctionne très bien. Disons que mon module 3 dépend de 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 cours mvn clean install, ma construction s'exécute 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 installsur le module 3 seul, je reviens en arrière et mvn installje cours sur mon pom parent pour le faire construire. Comment puis-je réparer cela?

utilisateur209947
la source
Pourriez-vous s'il vous plaît partager à quoi ressemble votre pom parent?
Chris Gummer

Réponses:

127

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 suggéraient d'utiliser à la <classifier>tests</classifier>place de <type>test-jar</type>. Bien que cela fonctionne actuellement dans certains cas, cela ne fonctionne pas correctement pendant la construction d'un réacteur du module JAR de test et de tout consommateur si une phase du cycle de vie avant l'installation est appelé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 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 empaqueter les tests compilés dans un JAR et les déployer pour une réutilisation générale, configurez le maven-jar-plugincomme 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 (à l'aide de mvn installou 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>
Pascal Thivent
la source
3
Pascal. Tout d'abord merci beaucoup d'avoir répondu à toutes les questions maven !! Concernant cette question. J'ai encore un problème. J'ai une classe testBase dans l'un de mes modules de base que je souhaite utiliser dans tous les objets enfants. Nous avons actuellement la construction maven dans notre CI. Si je ne veux faire aucune installation de déployer sur le test-jar et simplement vérifier une nouvelle copie du coffre et exécuter le test mvn. Cela échoue, car je n'ai pas encore le test-jar. Une idée de comment gérer cela?
Roman
@Roman Lancer l'installation est la manière «naturelle». Mais il semble que vous ayez trouvé une solution de contournement.
Pascal Thivent
Il semble que ce soit ce problème 3559 et non 2045 qui est le retard à ce stade: jira.codehaus.org/browse/MNG-3559
HDave
Bien que cela explique ce qui se passe, il ne fournit pas de solution de contournement. Il suggère simplement de faire ce que OP (et par exemple moi) fait déjà.
Antoniossss le
19

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

Travaille pour moi.

romain
la source
1
Oui, très pratique. Merci d'avoir partagé. Je suppose que l'approche de déploiement n'est meilleure que lorsque vous avez un annuaire d'entreprise (oui, je sais que cela est fortement recommandé). Merci @Roman
Damien
2

Comme le dit https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html :

Comment créer un fichier jar contenant des classes de test Lorsque vous souhaitez créer un fichier contenant des classes de test, vous souhaiterez probablement réutiliser ces classes. Il existe deux façons de résoudre ce problème:

  1. The easy way Créez un fichier jar joint avec les classes de test du projet en cours et perdez ses dépendances transitives de portée de 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.

Goofy
la source