【问题标题】:Maven brings "test" transitive dependency as "compile"Maven 将“测试”传递依赖作为“编译”
【发布时间】:2014-07-04 18:17:52
【问题描述】:

当我为我的项目运行“mvn dependency:tree”时,它显示以下内容:

[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,依赖项显示为“测试”。

Maven 版本:3.0.4

【问题讨论】:

  • xml-api 不是作为另一个依赖项出现在其他地方吗?
  • 测试依赖永远不会被打包到战争中,除非你做了一些奇怪的事情。请出示你的 pom 文件。
  • @khmarbaise 我知道,但出于某种原因,我拥有它! pom 文件很大,有几个父 pom... 我没有尝试提取最小的代码示例,相当乏味,但是 selenium-htmlunit-driver 依赖项绝对没有什么特别之处,像往常一样声明。
  • 非常有趣:如果我使用mvn dependency:tree,它会将dep 显示为compile,但如果我使用mvn -Dverbose dependency:tree,则dep 将变为test。我现在很确定这是 Maven 中某个地方的错误。作为一种解决方法,我在我的 pom 中明确声明了 xml-apis 依赖项,现在看来它可以工作了。
  • @SergeBallesta 它没有在我的任何 poms 中声明。当我在 selenium-htmlunit-driver 的排除列表中添加 dep 时,它消失了。据我了解,这意味着它不依赖于其他任何东西。

标签: java maven maven-3


【解决方案1】:

研究以下 Maven 命令的输出。

mvn -X dependency:tree -Dverbose

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

【讨论】:

    【解决方案2】:

    如果您查看xercesImpl,它包含对 xml-apis:xml-apis:jar:1.4.01:compile 的依赖项,范围为 compile,因此依赖项插件的显示是正确的。 -Dverbose 的用法将按照文档中的说明进行操作:

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

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

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

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

    【讨论】:

    • 我认为您没有全神贯注地阅读我的问题。如果您查看任何其他测试依赖项,例如htmlunit,它的所有依赖项都是编译的,但只有 xml-apis 显示为compile-Dverbose 应该只包括省略的节点(是的,它发生了),但在我的情况下,它也在改变范围。而.jar 被打包成战争。任何想法如何找到“其他来源”?我对 Maven 的了解告诉我没有其他来源。
    • 你必须从你的战争工件开始,并通过 mvn dependency:tree 查看所有工件的来源。
    • 树输出的片段在我的问题中。我看到的唯一来源是selenium-htmlunit-driver。如果我从驱动程序中<exclude> xml-apis,则 dep 从树中消失。
    • 您的输出不是从我提到的作为此类分析起点的战争开始的。
    • ... 表示我省略了很多其他输出,这些输出相当大且与问题无关。我已经为你添加了几行。
    【解决方案3】:

    我也遇到过类似的问题。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2019-08-13
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多