1. 程式人生 > 其它 >maven-shade-plugin解決Maven同一依賴多版本共存

maven-shade-plugin解決Maven同一依賴多版本共存

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:

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