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 中的所有类都复制到自己的项目中重写了一样,既然都重写了,改个类路径不是很合理吗?

posted @ 2022-07-29 09:46  菜菜聊架构  阅读(717)  评论(0编辑  收藏  举报