了解eclipse maven依赖层次结构

Posted

技术标签:

【中文标题】了解eclipse maven依赖层次结构【英文标题】:Understanding eclipse maven dependency hierarchy 【发布时间】:2019-02-03 03:22:30 【问题描述】:

我想了解多模块 maven 项目的依赖关系以及 eclipse 依赖层次结构。

我确实明白,但有些东西我根本无法理解。

以下是屏幕截图。

我不明白的事情是:

--> 从 1.0.2 管理 [编译

--> 从 1.0.2 管理(因与 1.0.0 冲突而省略)[编译]

我确实在网上搜索过,但我得到了踪迹中的信息。谁能帮我理解他们的意思是什么?

谢谢。

【问题讨论】:

【参考方案1】:

Maven 为每个用于编译 ([compile])、用于测试用于正在运行

在平面类路径中,与 OSGi 不同,依赖项只能存在于一个版本中。在您裁剪的屏幕截图中,除其他外,还有第二级:

kafka-streams 1.0.2 和 kafka-clients1.0.0

kafka-streams 1.0.2 需要 kafka-clients 1.0.2kafka-clients 1.0.0 冲突。因此kafka-streams 1.0.2 与 1.0.0 冲突时省略,即使此处需要 1.0.2 版本(“从 1.0 管理.2")。

更详细:用于编译或运行普通 Java 应用程序的类路径是平坦的:所有必需的库都全局指定为有序列表。不能对一个包使用特定版本的库,而对另一个包使用不同版本的同一个库。在 Maven 中,依赖项构建一棵树:每个依赖项可能都有自己的依赖项。 Maven 将依赖树映射到类路径,这是一个有序的库列表。如果在 Maven 依赖树中相同的库存在于不同的版本中,则无法创建平面类路径。这是一个冲突。通过选择一个版本并忽略所有其他版本来解决此冲突。在使用选择版本而不是所需版本的地方,会显示(managed from <required but not picked version>)(omitted for conflict with <picked version to use instead>)。此外,Maven 可以创建不同的类路径来编译、测试或运行 Java 应用程序,通过 so-叫scopes。 [compile] 范围是在所有任务中使用库的默认范围:编译、测试和运行。

确保pom.xml 文件中指定的版本彼此兼容(在您的屏幕截图中尚未出现这种情况):您必须 将 kafka-clients 从 1.0.0 升级到 1.0.2(或降级其他库)。

【讨论】:

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

以上是关于了解eclipse maven依赖层次结构的主要内容,如果未能解决你的问题,请参考以下文章

eclipse mave 配置启动报错

冲突的传递依赖关系在 Maven 中是一个严重的问题吗?

如何在插件中访问 Maven 的依赖层次结构

Maven的安装和配置

Maven知识 %Eclipse%

Eclipse m2eclipse 从本地存储库获取依赖项