Maven将“测试”传递依赖性称为“编译”

时间:2014-07-04 18:17:52

标签: java maven maven-3

当我运行" mvn依赖:树"对于我的项目,它显示以下内容:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ xxxxx ---
[INFO] com.xxx.xxx:xxxxx:war:3.1.0-SNAPSHOT
...
[INFO] +- commons-configuration:commons-configuration:jar:1.5:compile
[INFO] |  \- commons-beanutils:commons-beanutils-core:jar:1.7.0:compile
[INFO] +- org.seleniumhq.selenium:selenium-api:jar:2.34.0:test
[INFO] |  +- com.google.guava:guava:jar:14.0:test
[INFO] |  \- org.json:json:jar:20080701:test
[INFO] +- org.seleniumhq.selenium:selenium-htmlunit-driver:jar:2.34.0:test
[INFO] |  +- org.seleniumhq.selenium:selenium-remote-driver:jar:2.34.0:test
[INFO] |  |  +- cglib:cglib-nodep:jar:2.1_3:test
[INFO] |  |  +- net.java.dev.jna:jna:jar:3.4.0:test
[INFO] |  |  \- net.java.dev.jna:platform:jar:3.4.0:test
[INFO] |  \- net.sourceforge.htmlunit:htmlunit:jar:2.12:test
[INFO] |     +- org.apache.commons:commons-lang3:jar:3.1:test
[INFO] |     +- org.apache.httpcomponents:httpmime:jar:4.2.3:test
[INFO] |     +- net.sourceforge.htmlunit:htmlunit-core-js:jar:2.12:test
[INFO] |     +- xerces:xercesImpl:jar:2.10.0:test
>>>[INFO] |     |  \- xml-apis:xml-apis:jar:1.4.01:compile
[INFO] |     +- net.sourceforge.nekohtml:nekohtml:jar:1.9.18:test
[INFO] |     +- net.sourceforge.cssparser:cssparser:jar:0.9.9:test
[INFO] |     |  \- org.w3c.css:sac:jar:1.3:test
[INFO] |     \- org.eclipse.jetty:jetty-websocket:jar:8.1.9.v20130131:test
[INFO] +- org.seleniumhq.selenium:selenium-firefox-driver:jar:2.34.0:test
...

正如您在标记行上看到的那样,xml-apis已经"编译"范围,因此它被打包到.war文件中。为什么会发生?

更有趣的是,它仅在使用Java5时发生,对于Java6,依赖关系显示为" test"。

Maven版本:3.0.4

3 个答案:

答案 0 :(得分:3)

如果查看xercesImpl它包含对xml-apis的依赖:xml-apis:jar:1.4.01:使用scope编译进行编译,以便依赖插件的显示正确。 -Dverbose的使用将按照文档中的说明执行:

  

是否在序列化依赖关系树中包含省略的节点。

除了上述情况之外,测试依赖性在您的情况下永远不会打包到war文件中。

必须有一个相同依赖的其他来源导致包装进入战争

此外,与向您的pom添加显式xml-apis相关的行为变化是对此的补充证据。

答案 1 :(得分:3)

研究以下Maven命令的输出。

mvn -X dependency:tree -Dverbose

这应该告诉你为什么Maven将范围从测试升级到编译。

答案 2 :(得分:0)

我遇到了类似的问题。

在我的例子中,父pom的dependencyManagement中的一个条目设置了依赖artefact的编译范围。实际上我省略了范围标记,它实际上与设置编译相同。改变它提供帮助。 似乎dependencyManagement中的范围优先于传递范围。这是有道理的,但当你想要做的只是定义版本时,仍然会引起混淆。

实际上并不难发现:查看有效pom显示了dependencyManagement条目。