我们有一个非常奇怪的问题,特别是因为同样的解决方案适用于项目的其他部分。
我们正在与Maven 3合作
我们在模块A中有一个带有单元测试和一些类(即模拟)的模块。 对于源和测试源,模块B依赖于A.
所以我们做了以下事情:
在模块A中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
然后在模块B的pom中我们放了:
<!--Source dependency-->
<dependency>
<groupId>myGroup</groupId>
<artifactId>A</artifactId>
<version>${project.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!--Test dependency-->
<dependency>
<groupId>myGroup</groupId>
<artifactId>A</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
因此,当我们构建项目时,一切正常,从我所知的构建运行“安装”阶段,所以它是有道理的一切正常。 现在,我们正试图进行重新设计,在模块B的编译阶段,我们总是得到:
无法在项目B上执行目标:无法解析依赖项 对于项目myGroup:B:war:1.5.0.0:找不到 myGroup:A:jar:测试:1.5.0.0在“链接到我们的神器”中被缓存了 本地存储库,解决方案将不会重新尝试,直到 已更新“公司名称”的更新间隔或强制更新
从构建日志中我可以看到它在“maven-compiler-plugin”的执行过程中发生,那么为什么它只是试图获得测试范围中只有依赖的测试jar?
这不是我们第一次在我们的项目中使用这种方法而且它一直有效(到目前为止我们已经发布了几个版本)。
答案 0 :(得分:0)
一些背景:Maven使用两个类路径(编译和测试),因此,您将看到Maven编译插件被调用两次(一次是生产代码,一次是测试)。
上述错误意味着Maven无法在任何地方找到依赖项myGroup:A:jar:tests:1.5.0.0
。如果在第一个编译阶段(生产代码)发生这种情况,则意味着测试代码泄漏到生产(“编译”)类路径中,这是不好的。
如果在编译测试时发生这种情况,则意味着您在某处出现了拼写错误。
我从上面的代码中可以看到:<type>test-jar</type>
是错误的。 <type>
始终为jar
。要获得所需内容,您需要设置classifier
:
<!--Test dependency-->
<dependency>
<groupId>myGroup</groupId>
<artifactId>A</artifactId>
<version>${project.version}</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
也就是说,这是导出模拟和测试实用程序的不同解决方案:Where should I put test support code for a Java library
答案 1 :(得分:0)
我们有一个非常相同的情况,我们的解决方法是添加jar插件的第二个“哑”执行:
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
<execution>
<id>dumb</id>
<phase>compile</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
请注意,在直接的多模块项目中,我们发现这不是必需的。 moduleB上的mvn compile
在直接的多模块上不需要moduleA的test-jar。