问题形容
在 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>