利用maven-shade-plugin插件解决不兼容的依赖冲突的情况
使用场景的介绍
1.在maven工程中,我们常常遇到底层依赖包的版本冲突问题。如果高版本对低版本兼容,那么我们可以使用maven的exclusions排除掉低版本。但如果版本互不兼容,甚至是不同jar有相同类名的冲突,就比较棘手了。
2.例如我这个项目的epoint-sso-authenticator 依赖了一个低版本的bcprov-jdk15on,hutool的依赖了一个高版本的,里面有包名类名都重复的类,况且高版本不兼容低版本,二者都保留,必然会有一个功能报错,排除其中任何一个,对应的功能也会报错。
3.此时可以使用maven-shade-plugin,重新打一个新的jar包,将bcprov-jdk15on包名重置,并自动更改Hutool包中对bcprov-jdk15on包的import路径。
整合步骤
1、新建一个空的maven工程shaded-hutool,pom依赖如下;
<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>com.example</groupId>
<artifactId>shaded-hutool</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>shaded-hutool</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.7</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.67-e1</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>3.2.4</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>这里就是把hutool里关于引入的org.bouncycastle的类,统一修改成了shaded.org.bouncycastle,这样即使类名重复,包名也不会重复,不会产生冲突了。
2、新建的工程打包,解压后,发现把bcprov-jdk15on也给编译进去了,并且自动加了一个层级shaded。

3、反编译打包的代码,发现相关的类的导入已经变成自定义的了;

4、把重新打包的依赖发布到私.服,或者项目直接引入,排除项目其他的hutool依赖,这里就会用我们自己编译后的hutool了,只不过里面和项目冲突的类,更改了引用的包路径;

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot集成Spring AI构建AI智能客服模块
本文介绍了如何在SpringBoot项目中集成AI能力,包括创建项目、配置API密钥、开发AI对话服务以及测试验证,重点在于通过简单的示例展示AI对话的基本实现,为后续更复杂的进阶功能铺垫基础,需要的朋友可以参考下2026-04-04
IDEA 2019.2.2配置Maven3.6.2打开Maven项目出现 Unable to import Maven
这篇文章主要介绍了IDEA 2019.2.2配置Maven3.6.2打开Maven项目出现 Unable to import Maven project的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-12-12


最新评论