Maven:在第三方依赖项中使用的Shade版本

时间:2018-10-08 07:39:51

标签: maven maven-shade-plugin

说我的项目称为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的发行商,所以不能。

1 个答案:

答案 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。以您的示例为例,

  • 创建一个模块“ Bar-shaded”,该模块将创建一个阴影的JAR“ Bar”及其所有依赖项
  • 在模块“ A”中为“ Foo”版本1和“ Bar-shaded”添加依赖项