问题原因:某天开发某个需求,需要引入jar包,引入后项目各种报错,那肯定是刚引入的包(版本号1.45)出问题,idea全局搜有没有同个包,还真没搜到,下载个maven-helper(最后有说明),再次搜了下终于被我搜到了
<groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.59</version>
就是这个鬼东西,原项目中已经存在这个包,但我刚又引入了只是版本不同,一般来说高版本兼容低版本,但这次这个包还就不一般了(高版本不兼容低版本),还就得两个版本都得留,那maven-shade-plugin派上用场了
maven-shade-plugin
maven-shade-plugin在maven官方网站中提供的一个插件,官方文档中定义其功能如下:
This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade - i.e. rename - the packages of some of the dependencies.
简单来说就是将依赖的包在package阶段一起打入jar包中,以及对依赖的jar包进行重命名从而达到隔离的作用。这里为了解决上面的问题我们主要使用第二个功能特性,使得相同依赖不同版本达到共存的目的。
解决问题
1.idea新建maven项目
2.pom文件如下
<?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>org.bouncycastle</groupId>
<artifactId>bcprov-jdk14-shade</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk14</artifactId>
<version>1.45</version>
</dependency>
</dependencies>
<build>
<plugins>
<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>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<!--<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
<exclude>META-INF/*.MF</exclude>-->
</excludes>
</filter>
</filters>
<relocations>
<relocation>
<pattern>org.bouncycastle</pattern>
<shadedPattern>shade.org.bouncycastle</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
从配置文件中可以看到,由于maven-shade-plugin插件在解决这个问题上其实是通过对依赖进行重命名而达到隔离的目的,所以配置主要是集中在relocations中。这里将以org.bouncycastle开头的包全部重命名为以shade.org.bouncycastle开头。
执行maven-package并将包上传到公司私服,重新再项目中引入包
<groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk14-shade</artifactId> <version>1.0-SNAPSHOT</version> 到此解决同一个包不同版本问题,反编译工具看下包内容
META-INF中内容来自源包(不想要可以pom中配置filters),但MANIFEST.MF不来自源包,打包时maven自动生成,若想换成自己定义的,pom中新增
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifestFile>bin/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
manifestFile 文件路径自己定义
参考链接2:maven-shade-plugin解决Maven同一依赖多版本共存 - 码农教程
maven-helper安装
插件作用:一般用这款插件来查看maven的依赖树,可以查到隐藏jar包引入,比如jarA中又引入jarB,此时全局搜是搜不到jarB的,安装maven-helper插件解决问题
安装:两种离线或线上安装,我这边采用离线安装
1)官网下载mven-helper插件,版本号要和idea保持一致
Maven Helper - IntelliJ IDEs Plugin | Marketplace
2)到idea安装路径,找到D:\IntelliJ IDEA 2019.1\plugins(我的目录,根据自己的更换),将1)下载的插件解压到目录下
3)重启idea,打开项目根pom文件会出现Dependency Analyzer说明安装成功。