You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven:为exec-maven-plugin指定不同依赖版本的问题

让exec-maven-plugin使用指定版本POI依赖执行方法的解决方案

可以实现,无需依赖shading。你之前的配置未生效的核心原因是:exec-maven-plugin的java目标默认仅使用项目依赖的类路径,且不会自动将插件自身的依赖加入执行类路径;即使添加了插件依赖,默认顺序也是项目依赖在前,会优先加载POI 4.1.2。

具体调整步骤

  1. 开启插件依赖的类路径包含:在插件的<configuration>中添加<includePluginDependencies>true</includePluginDependencies>,让插件配置的POI 3.8依赖被加入执行类路径。
  2. 排除项目中的高版本POI依赖:在<configuration>中添加<dependencyExcludes>,移除项目依赖里的POI 4.1.2,避免类加载冲突。

调整后的完整插件配置

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <dependencies>
                <dependency>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi</artifactId>
                    <version>3.8</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-ooxml</artifactId>
                    <version>3.8</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <id>execute-method-using-oldpoi</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <configuration>
                        <mainClass>org.example.UsesOldPoi</mainClass>
                        <!-- 开启插件依赖的类路径包含 -->
                        <includePluginDependencies>true</includePluginDependencies>
                        <!-- 排除项目中的高版本POI依赖 -->
                        <dependencyExcludes>
                            <dependencyExclude>org.apache.poi:poi</dependencyExclude>
                            <dependencyExclude>org.apache.poi:poi-ooxml</dependencyExclude>
                        </dependencyExcludes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>projectold-poi</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version>
    </dependency>
</dependencies>

原理说明

  • <includePluginDependencies>true:将插件自身配置的依赖(POI 3.8)加入执行时的类路径。
  • <dependencyExcludes>:移除项目依赖中的POI 4.1.2,确保执行类路径中只有POI 3.8,避免类加载时优先加载高版本导致的方法缺失问题。

这样调整后,exec-maven-plugin执行指定方法时会使用POI 3.8版本,同时项目A自身的代码依然可以正常使用POI 4.1.2。

内容的提问来源于stack exchange,提问作者Marianne A.K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:47:04