利用maven-shade-plugin插件解決不兼容的依賴沖突的情況
使用場景的介紹
1.在maven工程中,我們常常遇到底層依賴包的版本沖突問題。如果高版本對低版本兼容,那么我們可以使用maven的exclusions排除掉低版本。但如果版本互不兼容,甚至是不同jar有相同類名的沖突,就比較棘手了。
2.例如我這個(gè)項(xiàng)目的epoint-sso-authenticator 依賴了一個(gè)低版本的bcprov-jdk15on,hutool的依賴了一個(gè)高版本的,里面有包名類名都重復(fù)的類,況且高版本不兼容低版本,二者都保留,必然會(huì)有一個(gè)功能報(bào)錯(cuò),排除其中任何一個(gè),對應(yīng)的功能也會(huì)報(bào)錯(cuò)。
3.此時(shí)可以使用maven-shade-plugin,重新打一個(gè)新的jar包,將bcprov-jdk15on包名重置,并自動(dòng)更改Hutool包中對bcprov-jdk15on包的import路徑。
整合步驟
1、新建一個(gè)空的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>
<!-- 指定項(xiàng)目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里關(guān)于引入的org.bouncycastle的類,統(tǒng)一修改成了shaded.org.bouncycastle,這樣即使類名重復(fù),包名也不會(huì)重復(fù),不會(huì)產(chǎn)生沖突了。
2、新建的工程打包,解壓后,發(fā)現(xiàn)把bcprov-jdk15on也給編譯進(jìn)去了,并且自動(dòng)加了一個(gè)層級(jí)shaded。

3、反編譯打包的代碼,發(fā)現(xiàn)相關(guān)的類的導(dǎo)入已經(jīng)變成自定義的了;

4、把重新打包的依賴發(fā)布到私.服,或者項(xiàng)目直接引入,排除項(xiàng)目其他的hutool依賴,這里就會(huì)用我們自己編譯后的hutool了,只不過里面和項(xiàng)目沖突的類,更改了引用的包路徑;

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合Kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼加減乘除功能
在開發(fā)Web應(yīng)用時(shí),驗(yàn)證碼是一個(gè)常見的功能,它可以幫助我們防止機(jī)器人的惡意操作,今天我們將學(xué)習(xí)如何使用Kaptcha生成圖片驗(yàn)證碼,并自定義驗(yàn)證碼內(nèi)容為100以內(nèi)的加減乘除運(yùn)算,感興趣的朋友跟隨小編一起看看吧2024-07-07
intelliJ idea 2023 配置Tomcat 8圖文教程
這篇文章主要介紹了intelliJ idea 2023 配置Tomcat 8教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
java實(shí)現(xiàn)讀取jar包中配置文件的幾種方式
本文主要介紹了java實(shí)現(xiàn)讀取jar包中配置文件的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Feign如何使用protobuf的類作為參數(shù)調(diào)用
這篇文章主要介紹了Feign如何使用protobuf的類作為參數(shù)調(diào)用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringBoot實(shí)現(xiàn)HTTP服務(wù)監(jiān)聽的代碼示例
前后端分離項(xiàng)目中,在調(diào)用接口調(diào)試時(shí)候,我們可以通過cpolar內(nèi)網(wǎng)穿透將本地服務(wù)端接口模擬公共網(wǎng)絡(luò)環(huán)境遠(yuǎn)程調(diào)用調(diào)試,本次教程我們以Java服務(wù)端接口為例,需要的朋友可以參考下2023-05-05
SpringBoot前后端分離實(shí)現(xiàn)驗(yàn)證碼操作
驗(yàn)證碼的功能是防止非法用戶惡意去訪問登錄接口而設(shè)置的一個(gè)功能,今天我們就來看看在前后端分離的項(xiàng)目中,SpringBoot是如何提供服務(wù)的2022-05-05

