我test-jar在多模块项目中使用依赖项时遇到麻烦。例如,当我声明cleartk-syntax模块依赖于这样的cleartk- token模块时test-jar(完整代码在此处):
test-jar
cleartk-syntax
cleartk- token
<modelVersion>4.0.0</modelVersion> <groupId>org.cleartk</groupId> <artifactId>cleartk-syntax</artifactId> <version>0.5.0-SNAPSHOT</version> <name>cleartk-syntax</name> ... <dependencies> ... <dependency> <groupId>org.cleartk</groupId> <artifactId>cleartk-token</artifactId> <version>0.7.0-SNAPSHOT</version> <type>test-jar</type> <scope>test</scope> </dependency>
如果我mvn compile使用Maven 2 运行,则会出现以下错误:
mvn compile
[INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Failed to resolve artifact. Missing: ---------- 1) org.cleartk:cleartk-token:test-jar:tests:0.7.0-SNAPSHOT
如果我使用Maven 3,则会收到错误消息:
[INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4.654s [INFO] Finished at: Mon Jan 24 21:19:17 CET 2011 [INFO] Final Memory: 16M/81M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal on project cleartk-syntax: Could not resolve dependencies for project org.cleartk:cleartk-syntax:jar:0.5.0-SNAPSHOT: Could not find artifact org.cleartk:cleartk-token:jar:tests:0.7.0-SNAPSHOT
在后一种情况下,我特别困惑,因为我认为它应该在寻找type test-jar而不是type 的工件jar。
jar
使用maven 2或maven 3,可以通过运行进行编译mvn compile package -DskipTests。使用maven 3,我还可以通过运行进行编译mvn compile test-compile。
mvn compile package -DskipTests
mvn compile test-compile
但是,为什么test-jar在该compile阶段中,maven 2或maven 3寻找依赖关系?它不应该等到test- compile阶段来寻找这种依赖性吗?
compile
test- compile
更新: 答案是,在我的编译阶段使用的maven-exec-plugin 需要对scope:test中的工件进行依赖项解析。我创建了一个功能请求,以删除scope:test依赖项。
在我看来,这似乎是个确定的错误。
我有同样的问题,并测试了Maven 3.0.1和3.0.2。验证不会失败,只有编译步骤会失败。随着Maven 3 mvn compile休息,但mvn test-compile可以。
mvn test-compile
看起来编译阶段正在反应器中寻找测试罐工件,然后在仓库中进行回购,但不应这样做,因为依赖项在测试范围内。测试范围工件应在测试编译而不是编译期间解决。
结果,我认为可以通过将Maven-compiler-plugin的testCompile目标映射到编译阶段而不是默认的test-compile阶段来解决。
我将其添加到pom中,紧接在上游pom中添加测试罐创建的部分旁边:
<!-- there is a bug in maven causing it to resolve test-jar types at compile time rather than test-compile. Move the compilation of the test classes earlier in the build cycle --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <executions> <execution> <id>default-testCompile</id> <phase>compile</phase> <goals> <goal>testCompile</goal> </goals> </execution> </executions> </plugin>
但这也不起作用,因为在编译和测试-编译之间的五个阶段都没有运行并设置诸如测试类路径之类的东西。
我猜在修正此错误之前,真正的解决方法是使用test-compile代替compile。
test-compile