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中引用的地方也改名(自動),並且代碼中用高本版的地方也改個名(手動)。

解決方法

  1. 創建一個空maven項目,引入poi-tl的依賴:
<dependencies>
    <!-- 這次新加的功能需要使用poi-tl -->
    <dependency>
        <groupId>com.deepoove</groupId>
        <artifactId>poi-tl</artifactId>
        <version>1.10.0</version>
    </dependency>
</dependencies>
  1. 引入插件並且配置好修改的方式:
<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的包,artifactIdversion是本項目創建時填寫的坐標。

如圖,我的這個maven項目叫rename-lib,版本是0.1:
target目錄

然后把這個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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM