maven-shade-plugin解決Maven同一依賴多版本共存
阿新 • • 發佈:2021-11-04
maven-shade-plugin解決Maven同一依賴多版本共存
之前我寫了一個使用jarjar.jar重新命名包名來解決maven依賴版本衝突的問題,今天逛V2EX的時候看到有人提到maven-shade-plugin外掛,就親自試了下,發現的確非常方便,因此做下記錄。
問題描述
首先說明遇到的問題:專案中已經存在poi 3.17的依賴,而poi-tl最低poi版本4.12,將專案中已有的3.17升級到4.12時,舊程式碼出錯,但是不升級就無法使用poi-tl。
如果一個版本相容另一個版本,只需要使用exclusions標籤排包即可
其中pom.xml示例如下:
<dependencies> <!-- 專案中已經引用3.17 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <!-- 這次新加的功能需要使用poi-tl,最低poi版本4.12 --> <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.10.0</version> </dependency> </dependencies>
解決思路
我們要做的就是把poi-tl中的高版本poi包改個名字,同時poi-tl中引用的地方也改名(自動),並且程式碼中用高本版的地方也改個名(手動)。
解決方法
- 建立一個空maven專案,引入poi-tl的依賴:
<dependencies> <!-- 這次新加的功能需要使用poi-tl --> <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.10.0</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> <createDependencyReducedPom>true</createDependencyReducedPom> <relocations> <relocation> <!-- 改名前 --> <pattern>org.apache.poi</pattern> <!-- 改名後 --> <shadedPattern>shaded.org.apache.poi</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> </plugins> </build>
執行mvn package
,如果是IDEA直接雙擊Lifecycle中的package
就行了。
這時target目錄中會有兩個包,一個是original開頭的原本包,因為我們沒有新建類,所以這個包是空的。
另一個是和artifactId-version.jar
的包,artifactId
和version
是本專案建立時填寫的座標。
如圖,我的這個maven專案叫rename-lib,版本是0.1:
然後把這個shaded包引入專案中使用即可,如果要使用高版本poi只需要import shaded.org.apache.poi
下的類即可。
參考:
其他
排包舉例,比如排除poi-tl中的poi包
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.10.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</exclusion>
</exclusions>
</dependency>