了解Eclipse Maven依赖层次结构

13

我想了解多模块Maven项目的依赖关系,并参考Eclipse依赖层次结构。

我有一定的理解,但有些东西我完全不理解。

以下是屏幕截图。

我不理解的事情是:

--> managed from 1.0.2 [Compile}

--> managed from 1.0.2 (omitted for conflict with 1.0.0) [Compile]

我在网上搜索过,但只找到了零散的信息。有人能帮我理解这些内容吗?

谢谢。

enter image description here

1个回答

11
Maven从依赖树中构建一个扁平的类路径,分别用于编译([compile])、测试和运行。在扁平的类路径中,不同于OSGi,一个依赖只能存在一个版本。在你的截图中,第二层有以下内容:kafka-streams 1.0.2和kafka-clients 1.0.0kafka-streams 1.0.2需要kafka-clients 1.0.2,与kafka-clients 1.0.0冲突。因此,即使此处需要版本1.0.2("managed from 1.0.2"),kafka-streams 1.0.2也会因与1.0.0冲突而被省略
更详细的解释:
编译或运行普通Java应用程序所使用的类路径是平面的:所有必需的库都作为有序列表全局指定。不可能为一个包使用特定版本的库,而为另一个包使用不同版本的同一库。
在Maven依赖项中构建树形结构:每个依赖项可能有自己的依赖项。Maven将依赖关系树映射到类路径,即有序的库列表。如果在Maven依赖关系树中存在相同的库但版本不同,则无法创建平面类路径。这是一个冲突。
通过选择一个版本并省略所有其他版本来解决此冲突。在使用选定版本代替所需版本的位置上,显示(来自<所需但未选择的版本>)(因与<要使用的选择版本>存在冲突而被省略)
此外,Maven可以通过所谓的scopes创建不同的类路径来编译、测试或运行Java应用程序。 [compile]范围是在所有任务中使用库的默认范围:编译、测试和运行。
请确保在pom.xml文件中指定的版本是彼此兼容的(这在您的屏幕截图中还不是这种情况):您需要将kafka-clients从1.0.0升级到1.0.2(或降低其他库的版本)。

2
感谢您的回答,非常有用,我必须说这些信息不容易通过“谷歌搜索”获得。我还有几个问题,请帮助我理解。1)什么是平面类路径?2)“管理自...”的含义是什么?3)“因与...冲突而省略”。我确实在谷歌上搜索了这些消息,但我没有得到任何有意义的东西,可以帮助我更好地理解。请求您能否详细说明一下,以帮助更好地理解。谢谢。 - CuriousMind
3
@CuriousMind (1) "Flat" 意味着在类路径中,必需的库被全局指定为有序列表,而您的截图显示 Maven 依赖项是树形结构(每个依赖项可能有自己的依赖项)。您无法说,对于这个包使用库1.0.0,但对于另一个包使用同样的库1.0.2来编译或运行它。Maven 将依赖关系树映射到类路径中(有序的库列表)。(2+3) 如果在 Maven 依赖树中存在不同版本的同一库,则无法创建平坦的类路径。这是一个冲突。 - howlger
3
@CuriousMind ...(2+3) 这个冲突可以通过选择一个版本并省略所有其他版本来解决。在使用选定版本而不是所需版本的位置,将显示 (managed from <required but not used version>)(omitted for conflict with <picked version to use instead>) - howlger

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