使用maven-shade-plugin解决依赖版本冲突

项目里引入多个版本依赖时,最后只会使用其中一个,一般可以通过排除不使用的依赖处理,但是如果需要同时使用多个版本,可以使用maven-shade-plugin解决。

以最典型的poi为例,poi版本兼容性很低,如果出现找不到类或者类未定义之类的错误,一般就是因为poi版本不兼容。

项目有这样一个需求,需要使用poi-tl-ext实现word导出富文本,poi-tl-ext里使用的是poi 4.1.2,而原本项目里使用的是2.x,由于版本差异过大,使用新版本poi,会影响到系统的旧功能。

为了解决以上情况,需要同时使用两个版本的poi,之所以存在冲突,是因为存在同包同名的类,因此只要将其中一个包重命名,就可以解决冲突,maven-shade-plugin是一个打包工具,可以用这个工具重命名指定报名,并生成新的依赖包。

具体操作:

1、新建一个maven项目,在pom.xml中引入依赖,设置重命名规则

<?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>com.test</groupId>
    <artifactId>shade</artifactId>
    <version>4.1.2</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>io.github.draco1023</groupId>
            <artifactId>poi-tl-ext</artifactId>
            <version>0.4.22</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</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>
                                    </excludes>
                                </filter>
                            </filters>
                            <relocations>
                                <relocation>
                                    <pattern>org.apache.poi</pattern>
                                    <shadedPattern>shade.org.apache.poi</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>com.deepoove.poi</pattern>
                                    <shadedPattern>shade.com.deepoove.poi</shadedPattern>
                                </relocation>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

2、执行mvn package生成jar包

3、在项目里引入生成的jar包

<dependency>
            <groupId>com.test</groupId>
            <artifactId>shade</artifactId>
            <version>4.1.2</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib/shade-4.1.2.jar</systemPath>
</dependency>

4、需要使用4.1.2版本的poi类时,import重命名后的包名

### 使用 maven-shade-plugin 重命名依赖中的类以解决 POI 版本冲突使用 Apache POI 时,若项目中存在两个不同版本的 POI 依赖,并且这些版本中包含同包同名的类,会导致类加载冲突,从而引发运行时错误。为了解决此类问题,可以使用 `maven-shade-plugin` 对其中一个版本的类进行重命名,实现类路径隔离,从而允许两个版本共存于同一个项目中。 该插件通过在构建过程中将指定包名下的类重命名为新的包名,避免类名冲突。例如,可以将旧版本的 `org.apache.poi` 包重命名为 `com.shaded.poi.v39.org.apache.poi`,从而与新版本的 `org.apache.poi` 包隔离,确保两者可以共存[^1]。 #### 配置 maven-shade-plugin 实现类重命名 在 `pom.xml` 中配置 `maven-shade-plugin`,指定需要重命名的包路径,并生成带有重命名类的新 JAR 包。以下是一个典型的配置示例: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <relocation> <pattern>org.apache.poi</pattern> <shadedPattern>com.shaded.poi.v39.org.apache.poi</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> ``` 通过上述配置,Maven 在构建项目时会将所有 `org.apache.poi` 包下的类重命名为 `com.shaded.poi.v39.org.apache.poi`,从而避免与主项目中使用的高版本 POI 冲突[^3]。 #### 使用重命名后的类 完成构建后,项目中需要使用版本 POI 的部分应导入重命名后的类,例如: ```java import com.shaded.poi.v39.org.apache.poi.ss.usermodel.Workbook; ``` 而使用版本功能的代码则继续使用原始包名: ```java import org.apache.poi.ss.usermodel.Workbook; ``` 这种方式可以确保两个版本的 POI 同时存在于项目中,并且不会发生类冲突。 #### 注意事项 -使用 `maven-shade-plugin` 时,需注意重命名的粒度,避免遗漏关键类或引入不必要的类冲突- 如果重命名的包中包含资源文件(如配置文件),可能需要额外处理这些资源文件的路径问题。 - 插件生成的 JAR 包体积会变大,因为它包含了所有被重命名的类,因此需权衡构建输出的大小与实际需求。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bekote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值