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;