我有一个多模块Maven项目。为了这个例子,考虑两个模块:
data
consumer
模块consumer
将模块data
作为依赖项。
模块data
声明了一堆核心类。 src/test
下的测试使用它们。这些测试需要一些冗长的对象创建,所以我有一个类,其中包含一些实用方法来创建这些对象。此实用程序类(SampleDataHelper
)位于src/test
层次结构中。
我还在consumer
模块中进行了一些测试,需要创建一些这些冗长的对象。我想在SampleDataHelper
树中的测试中使用我的data src/test
类(在consumer src/test
中定义)。不幸的是,即使data
是consumer
的依赖关系,consumer
也看不到data src/test
下的类。
为了解决这个问题,我想我可以创建另一个模块(data-test
),并在 SampleDataHelper
src/main >。然后我将data-test
包含为data
的测试范围依赖项。不幸的是,这引入了循环依赖:data
使用data-test
,但data-test
也需要data
。
我提出的唯一解决方案是将SampleDataHelper
放在data src/main
test
下的SampleDataHelper
包下,并希望没有真正的应用程序代码可以调用它。
如何在模块之间共享我的src/main
课程,而将其放在{{1}}下?
答案 0 :(得分:122)
您的Consumer项目取决于您的Data项目,因此我们很高兴Data必须在Consumer之前构建。因此,使用建议in the comments的技术,我将确保您的Data项目包含您希望共享的所有测试代码,并配置POM以生成测试JAR:
<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>
您的Consumer项目将依赖于正常的Data JAR工件以及额外的test-jar
工件,当然还有测试范围:
<dependency>
<groupId>com.foo</groupId>
<artifactId>data</artifactId>
<version>1.0</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
我在很多场合都使用过这种方法而且效果很好。
答案 1 :(得分:1)
所以问题是data
模块中的(某些)测试依赖于SampleDataHelper
类?您可以将SampleDataHelper
类移动到src/main
模块的data-test
,如果您同时将测试(取决于特定类)移动到src/test
的{{1}} data-test
模块。因此,不会有更多的循环依赖。