使用Maven-Shade-Plugin构建时引入旧版本依赖问题排查
我来帮你分析下这个问题,首先明确一点:Maven Shade Plugin本身不会主动引入旧版本依赖,问题根源肯定是依赖树里存在冲突的版本,而Maven的依赖调解规则选中了旧版本。下面是一步步的排查和解决方法:
第一步:定位旧版本依赖的来源
你需要先搞清楚这些旧版本的Flyway和PostgreSQL是从哪个依赖引入的,这是解决问题的关键。运行下面的Maven命令,生成这两个依赖的详细依赖树:
mvn dependency:tree -Dverbose -Dincludes=org.flywaydb:flyway-core,org.postgresql:postgresql
这个命令会过滤出只和这两个依赖相关的路径,你能清楚看到哪个间接依赖引入了3.2.1和9.4.1212.jre7版本。
常见原因及解决方法
1. 间接依赖引入了旧版本
如果依赖树显示某个第三方库引入了旧版本,你可以在ModuleA的pom.xml里排除该库的旧版依赖:
比如发现com.old.dep:legacy-lib引入了旧版Flyway,就这么做:
<dependency> <groupId>com.old.dep</groupId> <artifactId>legacy-lib</artifactId> <version>x.y.z</version> <exclusions> <exclusion> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </exclusion> <exclusion> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> </exclusion> </exclusions> </dependency>
2. Maven依赖调解规则导致旧版本被选中
Maven默认会选择路径最短的依赖版本,如果路径长度相同,会选择pom里先声明的版本。如果Core模块的依赖路径和某个旧版本的路径长度一致,且旧版本被先声明,就会出现这个问题。
解决方法是在ModuleA的pom.xml里添加dependencyManagement,强制指定你需要的版本:
<dependencyManagement> <dependencies> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>5.2.4</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.6</version> </dependency> </dependencies> </dependencyManagement>
这个配置会覆盖所有依赖路径中的版本,强制Maven使用你指定的版本。
3. Core模块未正确安装到本地仓库
如果Core模块的最新版本(包含正确的依赖版本)没有被安装到本地Maven仓库,ModuleA可能会拉取旧的SNAPSHOT版本或者错误的版本。先在Core模块的根目录运行:
mvn clean install
确保Core的最新版本被安装,然后再构建ModuleA。
额外检查点
你在Shade Plugin里依赖了spring-boot-maven-plugin,如果你的ModuleA继承了Spring Boot Parent,要注意Spring Boot的依赖管理会不会覆盖你的版本。不过从你给出的旧版本号来看,应该不是这个原因,但可以检查下Spring Boot Parent的dependencyManagement里有没有相关版本配置。
内容的提问来源于stack exchange,提问作者user281693

