Maven-shade 支持同一个jar宝的不同版本解决方案
最近项目对接第三方时,遇到一个SM2解密问题,拿到第三方的密文后解密失败。首先想到C1C2C3 和C1C3C2的问题,于是......,半个小时后,决定要来第三方的sdk。
发现他们sdk依赖的jar是1.46版本,而我的项目依赖的是1.64。
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.46</version></dependency>
要降版本吗?想到不要想,降版本会导致现有的许多方法都要重写,还要重新测试,这代价我可接受不了,还是问问度娘别人是否遇到过同样的问题吧。
最终maven-shade-plugin 插件浮现在眼前,它可以对依赖的jar包的类路径进行修改。而1.64 和1.46 两个版本冲突,就是因为同一个类在不同的版本中使用方式不同,那么我只有改变其中一个jar包的类路径,同时依赖两个包不就可以了吗。
抱着试一试的态度:
1、新建一个空的Maven项目
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>cloneli.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.46</version> <dependencies> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.46</version> </dependency> <dependency> <groupId>third</groupId> <artifactId>sm-sdk</artifactId> <version>1.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <!-- Maven 的生命周期 --> <phase>package</phase> <goals> <!-- 插件目标 --> <goal>shade</goal> </goals> <configuration> <!-- <minimizeJar>true</minimizeJar>--> <!-- 配置多版本 jar 包中类路径的重命名--> <relocations> <relocation> <pattern>org.bouncycastle</pattern> <shadedPattern>cloneli.bouncycastle</shadedPattern> </relocation> </relocations> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> <exclude>META-INF/services/*</exclude> <exclude>META-INF/versions/*</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin> </plugins> </build></project>
其中dependencies 中 sm-sdk 是第三方提供的工具,它依赖的就是bcprov-jdk15on 1.46版本,我要做就是将这两个包中的org.bouncycastle.xxx进行修改,关键配置如下:
<relocation><pattern>org.bouncycastle</pattern><shadedPattern>cloneli.bouncycastle</shadedPattern></relocation>
2、install
install后在本地仓库中就生成了一个新的jar。然后可以在项目的pom.xml中加上下面的坐标,导入后,点开这个jar,会发现其内容就是sm-sdk 和 bcprov-jdk15on 的class文件,但是相关的类路径都已经变成了cloneli.bouncycastle.xxx
<dependency> <groupId>cloneli.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.46</version></dependency>
本地测试,看到了想要的结果,1.64 和1.46 和谐共处。
3、上传服务器
到这里还没有结束,不要忘记将新的jar上传公司的服务器,不然其他同事拿不到这个包。
总结
这里 maven-shade-plugin 插件单纯看效果,就和我们把 sm-sdk 和 bcprov-jdk15on 中的所有类都复制到自己的项目中重写了一样,既然都重写了,改个类路径不是很合理吗?