Maven:为exec-maven-plugin指定不同依赖版本的问题
让exec-maven-plugin使用指定版本POI依赖执行方法的解决方案
可以实现,无需依赖shading。你之前的配置未生效的核心原因是:exec-maven-plugin的java目标默认仅使用项目依赖的类路径,且不会自动将插件自身的依赖加入执行类路径;即使添加了插件依赖,默认顺序也是项目依赖在前,会优先加载POI 4.1.2。
具体调整步骤
- 开启插件依赖的类路径包含:在插件的
<configuration>中添加<includePluginDependencies>true</includePluginDependencies>,让插件配置的POI 3.8依赖被加入执行类路径。 - 排除项目中的高版本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
相关产品推荐
相关产品推荐

