利用maven-shade-plugin插件解决不兼容的依赖冲突的情况

 更新时间:2026年05月17日 10:39:52   作者:菜鸟呼叫总部  
本文介绍了在Maven工程中遇到底层依赖包版本冲突问题,使用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了,只不过里面和项目冲突的类,更改了引用的包路径;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Scala中优雅的处理Null问题

    Scala中优雅的处理Null问题

    Spark 采用混合方式,大部分情况下使用 Option,但个别时候出于性能原因才使用了null。一个很好的习惯是当有方法返回值可能为null的时候,使用Option来代替,本文给大家介绍Scala处理Null的知识详解,一起看看吧
    2021-08-08
  • 浅谈java线程中生产者与消费者的问题

    浅谈java线程中生产者与消费者的问题

    下面小编就为大家带来一篇浅谈java线程中生产者与消费者的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • SpringBoot通过ip获取归属地的几种方式分享

    SpringBoot通过ip获取归属地的几种方式分享

    在日常我们逛网站的时候会发现我们登录后会出现归属地信息,例如:我在广州登录会显示广东广州,有些更加精确的会显示到区县,那么我们来看看有哪些方式来获取归属地信息,今天我们来聊一聊
    2023-09-09
  • 一个简单的Java音乐播放器

    一个简单的Java音乐播放器

    这篇文章主要为大家分享一个简单的Java音乐播放器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Spring Boot中是如何处理日期时间格式的

    Spring Boot中是如何处理日期时间格式的

    这篇文章主要介绍了Spring Boot中是如何处理日期时间格式的,帮助大家更好的理解和学习spring boot框架,感兴趣的朋友可以了解下
    2020-11-11
  • Java中I/O流读取数据不完整的问题解决

    Java中I/O流读取数据不完整的问题解决

    本文主要介绍了ava中I/O流读取数据不完整的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 三种Java求最大值的方法

    三种Java求最大值的方法

    本篇文章给大家总结了在JAVA中求最大值的三种常用方法,以及代码做了分享,需要的朋友参考下。
    2018-02-02
  • SpringBoot集成Spring AI构建AI智能客服模块

    SpringBoot集成Spring AI构建AI智能客服模块

    本文介绍了如何在SpringBoot项目中集成AI能力,包括创建项目、配置API密钥、开发AI对话服务以及测试验证,重点在于通过简单的示例展示AI对话的基本实现,为后续更复杂的进阶功能铺垫基础,需要的朋友可以参考下
    2026-04-04
  • spring/springboot整合dubbo详细教程

    spring/springboot整合dubbo详细教程

    今天教大家如何使用spring/springboot整合dubbo,文中有非常详细的图文介绍及代码示例,对正在学习java的小伙伴有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • IDEA 2019.2.2配置Maven3.6.2打开Maven项目出现 Unable to import Maven project的问题

    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

最新评论