【问题标题】:Shade (relocate) one version of a transitive dependency, but not the other遮蔽(重定位)传递依赖的一个版本,但不遮蔽另一个版本
【发布时间】:2015-08-15 00:46:41
【问题描述】:

我有一个 Maven 项目,它包含两个依赖项,AB。这些中的每一个都传递地依赖于C,但它们依赖于不同版本的C。假设 A 依赖于 C 版本 1,而 B 依赖于 C 版本 2。

不幸的是,A 与版本 2 的字节码不兼容,B 与版本 1 也不兼容。(碰巧,A 是 source-compatible 与版本 2,但我认为这对我们没有帮助。)

这意味着我的项目中需要传递依赖的两个版本,并且我需要 A 使用版本 1,而 B 使用版本 2。

有没有办法做到这一点?

我曾假设我需要使用 shade 插件来重新定位 A 的包名及其所有依赖项,但这似乎是不可能的。如果我为 A 着色,它的依赖项不会被着色,它仍然会选择版本 2,并且无法运行。

【问题讨论】:

  • 我不认为这是可能的,因为 jdk 只会加载一个版本而不是两个版本。
  • 你可以看看这里:stackoverflow.com/questions/13620281/… 第一个答案表明这是可能的。第二个答案提供了一些可能对您有用的示例。
  • 2 岁的问题。仍然相关。

标签: java maven maven-shade-plugin


【解决方案1】:

创建另一个名为 A-wrapper 的项目包装器 A。将C 重新定位到A-wrapper。 然后在你的主项目中,依赖A-wrapperB

我在 pb2 和 pb3 上遇到过类似的问题,使用这种方式解决了。 https://stackoverflow.com/a/41394239/1395722

【讨论】:

    【解决方案2】:

    假设依赖A需要C的v1,而依赖B需要C的v2。您可以创建一个包含 v1 的 A 的 uber jar,但使用 shade 插件更改包装, 示例 jar A 的内容为 C 且带有新包装 "v1.c.something"。对 B 执行相同的操作,因此 jar B 的内容为 C 的新包装 "v2.c.something"。您只需要包含冲突的依赖项而不是全部。

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 2015-09-12
      • 2017-03-04
      • 1970-01-01
      相关资源
      最近更新 更多