Maven多模块部署时Jar加载错误依赖版本,如何强制使用pom指定版本?
Maven强制指定依赖版本解决方案
依赖仲裁规则适配
Maven默认遵循两个依赖版本仲裁规则,你可以先通过这个规则优先让你的模块在构建时拉取2.0版本:
- 路径最短优先:直接在你的模块pom.xml中显式声明commons-io 2.0版本依赖,直接声明的路径长度是1,远短于其他模块第四层传递依赖的路径长度,默认会优先使用2.0版本
- 声明顺序优先:如果存在多个同路径长度的依赖,把commons-io的声明放到依赖列表的最靠前位置即可
注意:这个方案只能解决你模块构建时的依赖版本选择,无法解决全局lib目录下JVM类加载器优先加载1.1版本的问题,如果需要从根本上避免冲突,推荐使用重打包方案。
重打包隔离(最稳妥,无侵入其他模块)
使用maven-shade-plugin插件将commons-io 2.0包重命名后内嵌到你自己的Jar包中,完全和全局的commons-io依赖隔离,不需要修改其他模块的任何配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <relocation> <pattern>org.apache.commons.io</pattern> <shadedPattern>my.custom.org.apache.commons.io</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin>
配置后构建生成的Jar会自动把所有commons-io的类迁移到自定义包路径下,你代码中对commons-io的调用也会自动替换为自定义路径的类,完全不会加载全局lib下的1.1版本。
其他可选方案
- 父POM统一管理:如果整个项目有统一的父POM,可以在父POM的
dependencyManagement节点中声明commons-io 2.0版本,所有子模块都会默认使用该版本,前提是确认其他依赖1.1版本的模块可以兼容2.0版本的接口 - 类加载顺序调整:如果部署容器支持自定义类加载优先级,可配置优先加载你模块内部的依赖Jar,再加载全局lib目录的Jar,该方案依赖容器能力,通用性较差
内容的提问来源于stack exchange,提问作者fko
相关产品推荐
相关产品推荐

