说我的项目称为A,而Foo和Bar是第三方库。 A取决于Foo版本1和Bar。 Bar取决于Foo版本2:
A -> Foo version 1
\-> Bar
\-> Foo version 2
在我的项目,A的POM中使用此Maven阴影插件配置
<relocation>
<pattern>Foo</pattern>
<shadedPattern>FooA</shadedPattern>
</relocation>
我使用的版本,即Foo版本1,将被重命名/重定位为FooA。
问题:可以重命名/重定位Foo版本2吗?我知道可以修改Bar的POM来完成此操作-但是,由于我不是Bar的发行商,所以不能。
答案 0 :(得分:2)
Maven不允许依赖同一工件的多个版本。依赖项解析的工作方式如下:
Maven选择“最近的定义”。也就是说,它使用依赖关系树中最接近您的项目的版本。您始终可以通过在项目的POM中明确声明版本来保证版本。请注意,如果两个依赖关系版本在依赖关系树中的深度相同,则第一个声明将获胜。
“最近的定义”意味着所使用的版本将在依赖关系树中最接近您的项目。例如,如果将A,B和C的依赖关系定义为A-> B-> C-> D 2.0和A-> E-> D 1.0,则在构建A时将使用D 1.0,因为从A出发的路径通过E到D的时间更短。您可以在A中向D 2.0显式添加一个依赖项,以强制使用D 2.0。
来源:Introduction to the Dependency Mechanism
就像在this answer中建议的那样,解决方案可能是产生具有此类冲突的每个模块的阴影JAR。以您的示例为例,