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