当前位置: 首页 > 知识库问答 >
问题:

Maven将“测试”可传递依赖项作为“编译”

韦辰钊
2023-03-14

当我为我的项目运行“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 API具有“编译”作用域,因此它被打包到。战争档案。为什么会这样?

更有趣的是,它只在使用Java5时发生,对于Java6,依赖项显示为“test”。

Maven版本:3.0.4

共有3个答案

莫飞翮
2023-03-14

我也有类似的问题。

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

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

徐唯
2023-03-14

如果你看一看xercesImpl,它包含了对xml API的依赖:xml API:jar:1.4.01:compile和scope compile,所以依赖插件的显示是正确的。使用-Dverbose将实现文档中所述的功能:

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

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

一定有另一个相同的依赖源,导致包装进入战争

此外,向pom中添加显式xml API的行为变化是这方面的补充证据。

秦宜修
2023-03-14

研究以下Maven命令的输出。

mvn -X dependency:tree -Dverbose

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

 类似资料:
  • 问题:Maven在我的测试中找不到一些依赖项 在我的pom中是这样导入的。xml: 我已经试过了: mvn测试编译 使Intellij缓存无效 重启Intellij 清除. m2并重建项目

  • 这个问题将澄清什么是传递依赖,以及它在Maven中如何在非常高的级别上工作。 我的定义是:在依赖树中,比如-- 若C在B中有范围编译,那个么将B声明为A的依赖项就足以用Maven构建A。但是,如果C在B中提供了作用域,那么当Maven构建A时,除非A在其依赖项中声明C,否则该构建不会根据C自动编译A。 这是正确的吗?

  • 主要内容:依赖传递,依赖范围,依赖范围对传递依赖的影响,依赖调节Maven 依赖传递是 Maven 的核心机制之一,它能够一定程度上简化 Maven 的依赖配置。本节我们将详细介绍依赖传递及其相关概念。 依赖传递 如下图所示,项目 A 依赖于项目 B,B 又依赖于项目 C,此时 B 是 A 的直接依赖,C 是 A 的间接依赖。 Maven 的依赖传递机制是指:不管 Maven 项目存在多少间接依赖,POM 中都只需要定义其直接依赖,不必定义任何间接依赖,Mav

  • 关于maven和传递依赖排除有几个问题。然而,我不能让它工作。我的pom中有一些依赖项,它们重新打包了一些库,以减小pom的大小。到目前为止,这是成功的。但是当我运行时,这些可传递的依赖项会被写入。类路径文件。尽管它们被排除在外,如以下摘录所示。 Apache Maven 3.3.3(7994120775791599e205a5524ec3e0dfe41d4a06;2015-04-22T13:57

  • 我的情况: 我有两个独立的项目A和B。 没有项目A。 A和B使用相同的库: < li >反射-0.9.9-RC1.jar < li >番石榴-11.0.2.jar < Li > XML-API-1.0 . B2 . jar < li>javassist-3.16.1-GA.jar < li>dom4j-1.6.1.jar < li>jsr305-1.3.9.jar 我制作了项目C,这是项目a的插件

  • 我创建了一个Maven项目(可重用库),该项目有许多依赖项(编译时和运行时),它们也可以过渡地依赖于其他许多依赖项。在maven中,我可以在pom中添加依赖项。xml及其可传递依赖关系将自动处理。所以,我将毫无问题地运行。 现在,我有一个非Maven(基于Ant的)项目,上面创建的库(Maven Lib)将使用它。 在这种情况下,运行时间