jar包冲突原因:
项目引入新的jar包时,如果项目存在该jar包的旧版本,且新旧版本互不兼容,指定旧版本jar包,新的代码引用就会报错,而使用新版本jar包,旧的代码就会报错,在改动量不大的情况下原则上优先升级旧代码,把报错的地方都改了自然最好,但现实存在各种不可抗力,而且屎山的维护原则就是旧代码能不动就尽量不动。
这次遇到的jar包冲突是bcprov.jar,这是一个SM2算法的加密相关jar包,新的代码依赖bcprov.jar的版本是jdk16-1.46,而项目中已有的bcprov.jar版本是jdk15on-1.69,最终决定将新的jar包重新打包,引用路径加一个前缀来解决。具体解决方案步骤如下:
- 使用IDEA新建一个空的maven项目
- 在pom.xml中引用我们需要的新依赖
- pom.xml中添加maven-shade-plugin组件(作用是将依赖的包在package阶段一起打入jar包中,以及对依赖的jar包进行重命名从而达到隔离的作用。第二个功能特性,使得相同依赖不同版本达到共存的目的。)由于maven-shade-plugin插件在解决这个问题上其实是通过对依赖进行重命名而达到隔离的目的,所以配置主要是集中在relocations中。这里将以org.bouncycastle开头的包全部重命名为以eta.org.bouncycastle开头。此时整个pom.xml文件如下:
<?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>eta</groupId>
<artifactId>eta</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
</dependencies>
<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>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<relocations>
<relocation>
<pattern>org.bouncycastle</pattern>
<shadedPattern>eta.org.bouncycastle</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- 使用maven的package打包生成jar文件,此时的jar包根目录就是以自定义的eta开头,将该jar包引入项目中,使用到新jar包的import路径调整下就ok了。
import eta.org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import eta.org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import eta.org.bouncycastle.crypto.params.ECPublicKeyParameters;
import eta.org.bouncycastle.math.ec.ECPoint;