J'ai un projet multi-module Maven. Pour cet exemple, considérons deux modules:
data
consumer
Le module consumer
a le module data
comme dépendance.
Le module data
déclare un groupe de classes de base. Il existe des tests sous src/test
Qui les utilisent. Ces tests nécessitent une création d’objets de longue haleine, j’ai donc une classe contenant des méthodes utilitaires pour créer ces objets. Cette classe d'utilitaires (SampleDataHelper
) se trouve dans la hiérarchie src/test
.
J'ai également quelques tests dans le module consumer
qui ont besoin de créer certains de ces objets longs. Je souhaite utiliser ma classe SampleDataHelper
(définie dans data src/test
) Dans des tests qui résident dans mon arbre consumer src/test
. Malheureusement, même si data
est une dépendance de consumer
, consumer
ne peut pas voir les classes qui existent sous data src/test
.
Pour lutter contre cela, j'ai pensé que je pourrais créer un autre module (data-test
), Et y déplacer SampleDataHelper
sous - src/main
. Ensuite, j'inclurais data-test
En tant que dépendance de la portée du test de data
. Malheureusement, cela introduit une dépendance circulaire: data
utilise data-test
, Mais data-test
Nécessite également data
.
La seule solution que j'ai proposée consiste à placer SampleDataHelper
sous data src/main
Sous un paquet test
et à espérer qu'aucun code d'application réel ne l'appelle jamais.
Comment puis-je partager ma classe SampleDataHelper
entre des modules sans la placer sous src/main
?
Votre projet Consumer dépend de votre projet Data. Nous sommes donc heureux que les données doivent être créées avant Consumer. En conséquence, en utilisant les techniques suggérées dans les commentaires , je veillerais à ce que votre projet Data contienne tout le code de test que vous souhaitez partager et à configurer le POM pour produire un fichier JAR de test:
<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>
Votre projet Consumer dépend alors à la fois de l’artefact normal du fichier JAR de données et du fichier test-jar
artefact, avec la portée du test:
<dependency>
<groupId>com.foo</groupId>
<artifactId>data</artifactId>
<version>1.0</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
J'ai utilisé cette approche à plusieurs reprises et cela fonctionne bien.
Le problème est donc que (certains) tests dans le module data
dépendent de la classe SampleDataHelper
? Vous pouvez déplacer la classe SampleDataHelper
vers src/main
du data-test
module, si vous déplacez simultanément les tests (qui dépendent de la classe spécifique) vers le src/test
du data-test
module. Par conséquent, il n'y aurait plus de dépendances circulaires.