我有一个包含两个依赖项的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,并且无法运行。
答案 0 :(得分:2)
创建另一个名为A
的项目包装器A-wrapper
。在C
中重定位A-wrapper
。
然后在您的主项目中,取决于A-wrapper
和B
。
我在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” 。您只需要包括冲突的依赖关系,而不是全部。