什么是Maven传递性依赖?

78
这个问题是关于澄清什么是“传递依赖(transitive dependency)”以及在Maven中它如何工作的。
我的定义:在一个依赖树中,比如 A --> B --> CC 是 A 的传递依赖。假设 BA 中的范围是 compile
如果 CB 中的范围是 compile,那么声明 B 作为 A 的依赖就足以使用 Maven 构建 A。但是,如果 CB 中的范围是 provided,那么当 Maven 构建 A 时,除非 A 声明了 C 作为其依赖,否则构建将不会自动编译 A
这样说对吗?

“compile A against C”中的against是什么意思?我是一个mvn初学者,我注意到这个例子正是我不知道的。我认为A against C是指在A.someClass中使用一些import C.someClass。这正确吗? - rado
@GabrielRado 我猜他的意思是如果C在B中有提供范围,那么生成的构件将不包括C。当你在编译时的类路径中有C,但在运行时由于某种原因没有提供时,这个语句 import C.someClass at A.someClass 将无法工作,你会得到一个找不到类定义的异常。 - Boss Man
3个回答

81

你的假设是正确的。

Maven 依赖有两种类型:

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

  • 传递依赖:这些依赖是你直接依赖项的依赖项。

带有 provided 范围的依赖项意味着:

  • 要么从最终构件中排除它们(例如,对于 war 文件,您不需要包括 servlet-apiservlet-jsp 等)
  • 或者被覆盖 -- 在继承它们的项目中定义版本和/或范围的覆盖

如果无法解决C怎么办?我怎么知道B->C,以便我可以更改B的版本?我检查了父POM和有效POM,但它们都没有。 - Philip Rego
如果Maven无法从远程仓库解析一个构件的POM文件,那么在尝试构建依赖树时,它将抛出一个错误。 - carlspring

2
举个例子,如果我们在pom.xml<dependencies>标签下添加了JUnit作为依赖项,它将下载其他hamcrest-core-1.3.jar文件,并且该文件位于Maven Dependencies文件夹下,这个.jar文件可以被称为传递依赖

enter image description here

资源:- https://youtu.be/ypVE8EgDzzI

-8

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接