什么是传递性 Maven 依赖项?

Posted

技术标签:

【中文标题】什么是传递性 Maven 依赖项?【英文标题】:What is a transitive Maven dependency? 【发布时间】:2017-06-03 05:00:39 【问题描述】:

这个问题即将阐明传递依赖到底是什么,以及它在 Maven 中是如何在非常高的层次上工作的。

我的定义:在像A --> B --> C这样的依赖树中,C是A的传递依赖。假设 BA 内具有 compile 范围。

如果CB中有compile作用域,则声明BA 足以用 Maven 构建 A。但是如果CB内有provided作用域,那么,当Maven构建A时,构建不会自动编译A 针对 C 除非 A 在其依赖项中声明 C

这对吗?

【问题讨论】:

“针对 C 编译 A”中的反对是什么意思?我是一个 mvn 初学者,我注意到这个例子正是我不知道的。我认为 A 对 C 是“在 A.someClass 使用一些 import C.someClass”。这是正确的吗? @GabrielRado 我猜他的意思是如果 C 在 B 中具有 provided 范围,那么生成的工件将不包括 C。此语句 import C.someClass at A.someClass 将在编译时在类路径中包含 C 时起作用,但如果由于某种原因在运行时未提供,则不会出现 class def found 异常。 【参考方案1】:

你的假设是正确的。

Maven 依赖有两种类型:

直接:这些是在pom.xml 文件中<dependencies/> 部分下定义的依赖项。

传递性:这些是您的直接依赖项的依赖项。

provided 范围的依赖项旨在:

从最终工件中排除(例如,对于您不想包含 servlet-apiservlet-jsp 等的 war 文件) 或覆盖 - 继承这些的项目定义版本和/或覆盖范围

【讨论】:

C不能解析怎么办?我怎么知道 B->C 所以我可以更改 B 的版本?我检查了父 pom 和有效 pom 它不存在。 如果工件的 POM 文件无法从远程存储库中解析,Maven 将在尝试构建依赖关系树时抛出错误。【参考方案2】:

声明项目时应包含的依赖项 本身就是一个依赖

【讨论】:

以上是关于什么是传递性 Maven 依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

[Maven实战]传递性依赖

maven依赖传递性依赖原则

Maven依赖的传递性

Maven依赖图解

04_项目一众筹00_05Maven依赖概念,依赖范围依赖传递性依赖的原则:解决jar包冲突依赖排除统一版本管理

Maven依赖解析