java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > maven-shade-plugin插件解决不兼容的依赖冲突

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

作者:菜鸟呼叫总部

本文介绍了在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了,只不过里面和项目冲突的类,更改了引用的包路径;

总结

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

您可能感兴趣的文章:
阅读全文