背景
最近, 我们提供给公司其他部门的 sdk, 对方在引入后, 运行报错, 因为他们项目中依赖的 jar 和我们提供的 sdk 依赖的 jar 冲突.
然而, 仅仅使用 exclusions 排除依赖, 可能并不能真正解决问题. 假如我们就是想引入两个不同版本的依赖呢?
方案
事实上, 已经有成熟的 maven 插件可以做这件事情, 就是 maven-shade 插件.
该插件原理就是手动配置好需要重命名的包和要改名为的包, 在 mvn package 时, 就会自动把依赖的 jar 修改 class 文件中的 package 声明和生成对应的包, 确保不会出现类全限定名冲突的情况
使用
将以下插件放入 pom.xml 的 build
>plugins
标签下
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<!-- 表示 org.codehaus.plexus.util 包下的类都改为 org.shaded.plexus.util 包下-->
<pattern>org.codehaus.plexus.util</pattern>
<shadedPattern>org.shaded.plexus.util</shadedPattern>
<!-- 指定不包含哪些包, 哪些类 -->
<excludes>
<exclude>org.codehaus.plexus.util.xml.Xpp3Dom</exclude>
<exclude>org.codehaus.plexus.util.xml.pull.*</exclude>
</excludes>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>