【问题标题】:Maven - version managed from x, omitted for duplicate?Maven - 从 x 管理的版本,省略重复?
【发布时间】:2015-02-18 18:51:24
【问题描述】:

当它声明从 x 管理的版本时,我无法理解 maven 依赖树中发生的情况;省略重复。

例如,假设我在server-a 的依赖管理部分定义了enterprise-data-2.4

我在server-a 的依赖关系树中得到以下内容,其中一个依赖关系server-b 拉入enterprise-data-2.4

[INFO] +- hello.world.welcome.to:server-b:jar:3.1-SNAPSHOT:runtime
[INFO] |  +- (hello.world.where.am: enterprise-data:jar:2.4:runtime - version managed from 3.0; omitted for duplicate)

假设server-b 是拉入enterprise-data-2.4 的唯一罐子,我的理解是server-a 将始终拉入enterprise-data-2.4 此处。这是正确的吗?

然而,server-b 中的代码依赖于enterprise-data-3.0,而server-b 的编译时间依赖于enterprise-data-3.0

现在,我有一个测试项目,比如说test-b,它测试server-b 存在于server-a 项目中的jar,并且对enterprise-data-3.0 有一个测试依赖项。这些测试直接命中server-a 上的代码。

当我在test-b 中运行我的测试时,我是否应该在尝试访问enterprise-data-3.0 中存在的功能时出错,因为它没有被server-a 拉入,或者它会通过,因为enterprise-data-3.0 存在测试依赖关系?它目前通过了,但我不确定测试依赖是否足够。

请帮助我理解。

编辑:我正在使用maven-3

谢谢。

【问题讨论】:

  • Maven 依赖中介传递依赖的工作通过使用第一个声明作为主。由于跟踪传递依赖项很麻烦,因此您确实应该研究依赖项管理。基本上在这里查看我的答案以了解详细信息:stackoverflow.com/a/26317934/136363
  • @t0mppa - 我正在使用依赖管理来引入企业数据 2.4。请再次阅读我的问题。
  • 好的,重新阅读并尝试回答您的问题。如果我仍然误解了你,请用一些具体的例子来编辑你的问题。

标签: java maven dependency-management


【解决方案1】:

例如,假设我在 server-a 的依赖管理部分定义了 enterprise-data-2.4

然后你总是会得到 2.4,即使只有依赖于 1.8 的 JAR。依赖管理覆盖依赖中介。

假设 server-benterprise-data-2.4 中唯一拉取的 jar,我的理解是 server-a 将始终拉取在 enterprise-data-2.4 中。这是正确的吗?

假设你没有依赖管理,那么是的。如果有多个依赖于不同版本的依赖,那么根据 Maven 版本 > 2.0.9 的依赖中介规则,首先加载哪个(及其传递依赖)是一个问题。其他将是:“从 x 管理并省略重复”。

当我在 test-b 中运行测试时,我是否应该在尝试访问 enterprise-data-3.0 中存在的功能时遇到错误,因为它没有被 server-a 还是会因为对 enterprise-data-3.0 有测试依赖而通过?它目前通过了,但我不确定测试依赖是否足够。

如果它使用不兼容的代码提取错误的版本,是的,您会看到错误。对于 Maven 3,使用 3.0 定义测试范围依赖项并使用 2.4 编译范围依赖项将意味着 Maven 覆盖 2.4 并使用在测试范围中定义的较新版本。详情请见this question and its answers

不过,您始终可以在 test-b 中使用依赖管理来修复您想要使用的每个依赖的版本。

【讨论】:

  • 感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2020-07-01
  • 2016-06-05
  • 1970-01-01
  • 2022-06-17
相关资源
最近更新 更多