我正在开发的项目由多个模块组成,使用maven构建。 某些模块中的测试代码依赖于来自其他模块的测试代码。 这些依赖关系声明如下。
在依赖模块中:
<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>
在依赖于前一个模块的模块中:
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>themodulename</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
使用此配置,maven install 阶段可以成功执行。 但是,尝试运行 compile 或 test 阶段失败,因为无法解析测试jar文件依赖性。
查看 test-jar 目标,它似乎被配置为在包阶段默认运行,我认为这是导致问题的原因。< / p>
然后,我尝试在编译阶段强制执行此目标,方法是将第一个配置修改为:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
查看调试日志,我可以看到目标现在在编译阶段执行,但也是这样:
[WARNING] JAR will be empty - no content was marked for inclusion!
我尝试将包含配置为** / *并确认默认的testClassesDirectory设置为正确的,但我仍然得到相同的警告。
我可以看到运行 compile 阶段后test-classes文件夹不存在,这似乎正常,但即使它在运行 test 阶段后仍然存在,它包含文件,我仍然得到“JAR将为空”警告。
有没有人知道修复此配置,以便我可以成功运行编译或测试阶段?
答案 0 :(得分:5)
我认为这些插件配置适合您。
在资源准备和编译中将跳过覆盖为false。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>default-testResources</id>
<configuration>
<skip>false</skip>
</configuration>
<phase>process-test-resources</phase>
<goals>
<goal>testResources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>default-testCompile</id>
<configuration>
<skip>false</skip>
</configuration>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<configuration>
<skip>false</skip>
</configuration>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
答案 1 :(得分:3)
我坚信测试应该只是一个模块的一部分。您不应该依赖其他模块中的测试。如果更新测试的行为不同,很难预测会发生什么。
如果您需要共享通用测试数据或常见测试类,那么最好使用该共享测试源创建单独的模块。然后让所有测试都依赖于带有范围测试的共享测试jar。
+-- MyProject
+-- common-test-util
| +-- src
| | +-- main
| | +-- java
| +-- pom.xml
+-- moduleA
| +-- src
| | +-- main
| | | +-- java
| | +-- test
| | +-- java
| +-- pom.xml
+-- moduleB
| +-- src
| | +-- main
| | | +-- java
| | +-- test
| | +-- java
| +-- pom.xml
+-- pom.xml
确保您只依靠common-test-util
与<scope>test</scope>
,然后您就可以致电
mvn test
在顶层,所有测试都将运行。
答案 2 :(得分:3)
您的问题归结于多模块构建中的依赖项解析。它与测试代码没有特别的关系。
我有这个设置。一个通用模块包含运行时代码以及共享测试代码(测试双精度和模拟等)。测试代码由其他模块中的测试使用。它对我们很有效。
“mvn compile”仅编译运行时代码。
在父级别(反应堆构建)运行“mvn test-compile”,“mvn test”或“mvn package”一切都很完美。反应堆可以将它全部分类。
如果您在模块级别运行构建,那么该模块的所有依赖项都必须在repo中。这意味着您必须为每个依赖模块主要运行“mvn install”。此规则同样适用于常规依赖项和测试依赖项。
如果您希望它跟随父母链接到父母,再到其他模块,我必须让您失望。父链接仅用于继承pom中的常用设置,而不用于依赖项解析。
就个人而言,我几乎总是从父母那里做一个完整的反应堆构建。如果我以前在父级别运行mvn安装并且我知道其他模块没有更改,我只进行单独的模块构建。
希望有所帮助。