代码之家  ›  专栏  ›  技术社区  ›  flow2k

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

  •  1
  • flow2k  · 技术社区  · 6 年前

    假设我的项目名为A,Foo和Bar是第三方库。A取决于Foo版本1和Bar。Bar取决于Foo版本2:

    A -> Foo version 1  
      \-> Bar  
          \-> Foo version 2
    

    在我的项目的,A的,POM中使用Maven shade插件配置

    <relocation>
      <pattern>Foo</pattern>
      <shadedPattern>FooA</shadedPattern>
    </relocation>
    

    问题:是否可以重命名/重新定位Foo版本2?我知道这可以做到,如果我可以修改酒吧的POM-但是,我不能,因为我不是酒吧的分销商。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Roland Weisleder    6 年前

    Maven不允许依赖于同一工件的多个版本。依赖项解析的工作方式如下:

    “最近的定义”意味着使用的版本将是依赖树中最接近您的项目的版本。例如,如果A、B和C的依赖项定义为A->B->C->D 2.0和A->E->d1.0,则在构建A时将使用d1.0,因为从A到D到E的路径较短。可以在中显式地向D2.0添加依赖项,以强制使用D2.0。

    Introduction to the Dependency Mechanism

    就像在 this answer 解决方案可以是为每个模块生成带有此类冲突的着色jar。以你为例,这就是

    • 创建一个模块“barshaded”,它创建一个包含“Bar”及其所有依赖项的着色JAR