【问题标题】:A dependency depends on older version of a library already used in the project依赖项依赖于项目中已使用的旧版本库
【发布时间】:2014-07-07 05:46:20
【问题描述】:

这对我来说听起来像是一个普遍的问题,所以我想知道是否有一种通用的推荐方法来处理这些情况,而不管使用的是什么构建/依赖管理工具(在我的例子中是 Gradle)。我可以想象无论构建工具如何都会出现这个问题,即使是在一个手动处理少量依赖项并且只是使用 Java 使用 jar 命令构建的小项目中也是如此。

我的 Java 项目使用 Velocity 1.7,因此它的类路径中有 Velocity 1。7 JAR。

然而,这个项目也使用 ReportNG,它依赖于 Velocity 1。4(它甚至在其清单中有条目 Class-Path: velocity-dep-1.4.jar,而且其下载的 zip 包含 @ 987654324@ 及其home page 明确提到velocity-dep-1.4.jar 必须在类路径中)。

我想知道如何避免在我的类路径中包含两个 Velocity 版本的 JAR,这可能是我看到的奇怪行为的原因,而且在任何情况下听起来都不是一个好主意。

我将尝试让 ReportNG 使用 Velocity 1.7 而不是 1.4,但这不一定有效,如果有处理这些情况的干净方法,我想避免这样做。

【问题讨论】:

  • 在构建路径中是否还有其他不需要的 jar?
  • 不,虽然我不清楚为什么这很重要。但是我不确定我是否可以说这些 Velocity JAR 中的任何一个都是不必要的:项目本身需要 1.7 的 JAR,而只有 ReportNG 需要 1.4 的。

标签: java jar velocity dependency-management reportng


【解决方案1】:

虽然您可以将两个 JAR 添加到类路径中,但默认情况下,Java 将使用它找到的包含给定类的第一个 JAR,这取决于您构建类路径的方式可能会对您的系统产生不良影响。

为了避免这种情况,Gradle(就像之前的 Maven)在构建时解决依赖冲突。

使用 Gradle,默认 dependency resolution 使用最新的依赖项,在您的情况下意味着 Velocity 1.7。

使用 Maven dependency resolution 是通过使用与您的项目最接近的依赖项来实现的,在您的情况下,当您的项目声明对 Velocity 1.7 的依赖项时,这意味着将使用该版本。

对于这两种方法,您的系统(或者更确切地说是 ReportNG)是否可以与 Velocity 1.7 一起使用取决于您自己的测试。

【讨论】:

  • 谢谢,这有帮助。我实际上正在尝试使用 Velocity 1.7 的 ReportNG 。所以,由于我使用的是 Gradle,整个项目——包括它的 ReportNG 依赖项——已经只使用了 Velocity 1.7 JAR,这意味着 1.4 JAR 可能根本不存在,也不会有所作为(如果我理解正确的话)。但后来我不明白这一点:假设 Velocity 1.4 有一个不在 1.7 中的类,假设 ReportNG 实际上引用了该类。在这种情况下会发生什么?
  • 如果 Velocity 1.7 中缺少一个类并且 ReportNG 尝试使用该类,您将在运行时得到一个 ClassNotFoundException。然而,对于像 Velocity 这样的高质量库,情况不太可能出现这种情况,尽管唯一确定的方法是测试、测试和测试更多
  • 好的,所以根据您的回答,我一直只使用 1.7,并且由于 Gradle 依赖关系解析而忽略了 1.4,我可以得出结论,ReportNG 可以使用 Velocity 1.7(至少在直到现在我一直运行它的方式)因为我没有得到任何运行时异常。不过我会按照你的建议继续测试。
  • 我可以确认 ReportNG 在 Velocity 1.7 上运行良好。
猜你喜欢
  • 2021-12-30
  • 2020-07-24
  • 2020-04-17
  • 2020-11-28
  • 2023-04-02
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多