【问题标题】:How to force classifier on transitive dependencies?如何强制分类器传递依赖?
【发布时间】:2018-07-13 09:50:43
【问题描述】:

我有依赖:

  • A
  • B(这也取决于A)。

现在,我想在A 上使用说明符,可以说:A-foo。但是,B 仍然依赖于A,因此,我将A-fooA 都包含在目标工件中。

有没有办法强制分类器依赖某些依赖?

为什么?

我需要这个的原因如下。

我的A 是一个基于 Java8 构建的 Java 库,但打包为 Multi-Release Jar,这意味着它包含在 Java9 上运行 jar 时的其他类。

不幸的是,一些旧工具和服务器不知道 MR Jars,这使得它们无法工作。

出于这个原因,我有我的库的A-foo 版本,即没有任何额外的类,所以旧服务器可以运行它。

但是,如果用户正在使用依赖于我的A 的库B,他将只获得A 的MRJar 版本,它会再次失败。我希望能够以某种方式防止这种情况发生。

【问题讨论】:

  • 关于“为什么”部分:如果 B 能够在库的 A-foo 版本上运行,为什么不总是将其用作 B 的依赖项?这似乎是一个简单的出路。如果您的应用程序确实更复杂,并且您希望同时加载 A 和 A-foo,则需要通过版本号来处理。如果你有一个 1.0.0 版本和一个 1.0.0-MRJar 版本,那么 Maven 将只加载其中一个,并且很容易替换另一个。
  • 因为 1) B 不在我的控制范围内 2) B 应该尽可能使用 A,因为它可以提供更高的性能 3) B 如果在 Java9 上需要 A。
  • 我会将 A-foo 定义为 A 的不同版本(如上所述)。然后很容易用dependencyManagement覆盖版本号(因此用A-foo替换A)。分类器不是正确的方法。您甚至可以尝试使用配置文件并根据 Java 版本激活/停用它们。

标签: maven gradle dependencies maven-3


【解决方案1】:

在 Gradle 中,这可以通过以下代码实现:

compile ('org.jodd:jodd-core:4.1.4:jre9') {
    force = true
}
compile ('org.jodd:jodd-joy:4.1.4') {
    exclude group: 'org.jodd', module:'jodd-core'
}

这意味着:

  • 强制分类器使用库;
  • 排除传递性非分类器库的依赖项

【讨论】:

    【解决方案2】:

    带有分类器的工件是不同的工件,而不仅仅是同一工件的不同版本。它不能替代——无论是技术上还是逻辑上——原始工件,意思是:即使你在技术上找到解决方法,它也违反了 Maven 逻辑。

    如果您更详细地描述您要解决的问题,您可能会找到一种“Maven 方式”来解决问题。

    【讨论】:

    • 谢谢!我真的不知道如何解释它比这更简单:(这正是我的问题。
    • 也许您可以解释一下为什么要进行此替换。
    • 好的,刚刚做了。
    • 难道 gradle 真的有办法指定传递依赖吗?
    猜你喜欢
    • 1970-01-01
    • 2021-04-09
    • 2022-01-03
    • 2021-07-26
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2019-11-04
    • 2018-07-06
    相关资源
    最近更新 更多