Shade(重定位)传递依赖的一个版本,而不是另一个版本

时间:2015-06-01 14:00:21

标签: java maven maven-shade-plugin

我有一个包含两个依赖项的Maven项目, A B 。其中每个都依赖于 C ,但它们依赖于 C 的不同版本。我们假设 A 取决于 C 版本1,而 B 取决于 C 版本2。

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

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

有没有办法做到这一点?

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

2 个答案:

答案 0 :(得分:2)

创建另一个名为A的项目包装器A-wrapper。在C中重定位A-wrapper。 然后在您的主项目中,取决于A-wrapperB

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

答案 1 :(得分:0)

假设依赖项 A需要C的v1 ,而依赖项 B需要C的v2 。您可以创建A的超级容器,其中包含C的v1,但可以使用shade插件更改包装, 示例jar A的C内容带有新包装“ v1.c.something” 。对B执行相同的操作,因此jar B包含C的内容,并带有新包装“ v2.c.something” 。您只需要包括冲突的依赖关系,而不是全部。