乐趣区

关于java:利用mavenshadeplugin插件解决不兼容的依赖冲突问题

问题形容

在 maven 工程中,咱们经常遇到底层依赖包的版本抵触问题。如果高版本对低版本兼容,那么咱们能够应用 maven 的 exclusions 排除掉低版本。但如果版本互不兼容,甚至是不同 jar 有雷同类名的抵触,就比拟辣手了。

比方,我在某个 java 工程中即应用了 Hutool 的加密工具类,也应用了 openfeign 的 feign 接口。而 Hutool 依赖了 bcprov-jdk15to18,openfeign 依赖了bcprov-jdk15on,这两者就有类名抵触,比方org.bouncycastle.crypto.engines.SM2Engine 的类构造方法不同。此时无论你排除哪个 jar,都会导致另一个性能出错。如果你两个 jar 都依赖,那么在运行时,必有一个性能抛出异样。因为 jvm 只会加载其中一个类。

解决办法

能够应用 maven-shade-plugin,从新打一个新的 jar 包,将bcprov-jdk15to18 包名重置,并主动更改 Hutool 包中对 bcprov-jdk15to18 包的 import 门路。

创立新工程

创立一个没有代码的空的 maven 工程lib-hutool,其 pom 如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>cn.hutool</groupId>
 <artifactId>lib-hutool</artifactId>
 <version>1.0.0-RELEASE</version>
 <name>lib-hutool</name>

 <dependencies>
 <dependency>
 <groupId>cn.hutool</groupId>
 <artifactId>hutool-all</artifactId>
 <version>5.5.1</version>
 </dependency>
 <dependency>
 <groupId>org.bouncycastle</groupId>
 <artifactId>bcprov-jdk15to18</artifactId>
 <version>1.66</version>
 </dependency>
 </dependencies>
 <build>
 <plugins>
 <!-- 指定我的项目 java 编译版本 -->
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-compiler-plugin</artifactId>
 <configuration>
 <source>1.8</source>
 <target>1.8</target>
 </configuration>
 </plugin>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-shade-plugin</artifactId>
 <version>2.4.3</version>
 <executions>
 <execution>
 <phase>package</phase>
 <goals>
 <goal>shade</goal>
 </goals>
 <configuration>
 <createDependencyReducedPom>true</createDependencyReducedPom>
 <relocations>
 <relocation>
 <pattern>org.bouncycastle</pattern>
 <shadedPattern>shaded.org.bouncycastle</shadedPattern>
 </relocation>
 </relocations>
 <filters>
 <filter>
 <artifact>*:*</artifact>
 <excludes>
 <exclude>META-INF/*.SF</exclude>
 <exclude>META-INF/*.DSA</exclude>
 <exclude>META-INF/*.RSA</exclude>
 </excludes>
 </filter>
 </filters>
 </configuration>
 </execution>
 </executions>
 </plugin>
 </plugins>
 </build>
</project>

执行 maven 编译mvn package,失去lib-hutool-1.0.0-RELEASE.jar,能够抉择上传到 maven 私服。

更改我的工程依赖

将我的工程中的 pom 批改如下:

<!--    去除之前的 hutool 与 bcprov-jdk15to18 的依赖 -->
<!--    <dependency>-->
<!--      <groupId>cn.hutool</groupId>-->
<!--      <artifactId>hutool-all</artifactId>-->
<!--    </dependency>-->
<!--    <dependency>-->
<!--      <groupId>org.bouncycastle</groupId>-->
<!--      <artifactId>bcprov-jdk15to18</artifactId>-->
<!--    </dependency>-->

<!--    增加 lib-hutool 依赖 -->
<dependency>
 <groupId>cn.hutool</groupId>
 <artifactId>lib-hutool</artifactId>
 <version>1.0.0-RELEASE</version>
</dependency>
退出移动版