Ich habe ein Maven-Projekt mit mehreren Modulen. In diesem Beispiel werden zwei Module betrachtet:
data
consumer
Modul consumer
hat Modul data
als Abhängigkeit.
Das Modul data
deklariert eine Reihe von Kernklassen. Es gibt Tests unter src/test
, Die diese verwenden. Diese Tests erfordern einige langwierige Objekterstellung, daher habe ich eine Klasse mit einigen Dienstprogrammmethoden, um diese Objekte zu erstellen. Diese Dienstprogrammklasse (SampleDataHelper
) befindet sich in der Hierarchie src/test
.
Ich habe auch einige Tests im Modul consumer
, die einige dieser langatmigen Objekte erstellen müssen. Ich möchte meine Klasse SampleDataHelper
(definiert in data src/test
) In Tests verwenden, die sich in meinem Baum consumer src/test
Befinden. Obwohl data
eine Abhängigkeit von consumer
ist, kann consumer
die Klassen, die unter data src/test
Existieren, leider nicht sehen.
Um dem entgegenzuwirken, dachte ich, ich könnte ein ein anderes Modul (data-test
) Erstellen und SampleDataHelper
unter src/main
Dorthin verschieben.. Dann würde ich data-test
Als Testumfang Abhängigkeit von data
einfügen. Dies führt leider zu einer zirkulären Abhängigkeit: data
verwendet data-test
, Aber data-test
Erfordert auch data
.
Die einzige Lösung, die ich gefunden habe, ist, SampleDataHelper
unter data src/main
Unter einem test
-Paket abzulegen und zu hoffen, dass kein wirklicher Anwendungscode es jemals aufruft.
Wie kann ich meine SampleDataHelper
Klasse zwischen Modulen teilen ohne unter src/main
Setzen?
Ihr Consumer-Projekt hängt von Ihrem Data-Projekt ab. Daher freuen wir uns, dass Data vor Consumer erstellt werden muss. Infolgedessen würde ich mit den vorgeschlagenen Techniken in den Kommentaren sicherstellen, dass Ihr Datenprojekt den gesamten Testcode enthält, den Sie freigeben möchten, und das POM so konfigurieren, dass eine Test-JAR erstellt wird:
<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>
Ihr Consumer-Projekt würde dann sowohl vom normalen Data JAR-Artefakt als auch vom zusätzlichen Artefakt test-jar
Mit Testumfang abhängen:
<dependency>
<groupId>com.foo</groupId>
<artifactId>data</artifactId>
<version>1.0</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
Ich habe diesen Ansatz bei vielen Gelegenheiten verwendet und er funktioniert gut.
Das Problem ist also, dass (einige) Tests im Modul data
von der Klasse SampleDataHelper
abhängen. Sie können die Klasse SampleDataHelper
in src/main
Des Moduls data-test
Verschieben, wenn Sie gleichzeitig die Tests (die von der jeweiligen Klasse abhängen) in die Klasse src/test
Des Moduls data-test
. Folglich würde es keine zirkulären Abhängigkeiten mehr geben.