Maven嵌套依赖版本解析异常求助:okhttp版本不符预期
问题描述
我在模块A中配置了OkHttp 4.9.2的依赖:
<dependencies> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.2</version> </dependency> </dependecies>
模块B通过以下配置引入模块A:
<dependencies> <dependency> <groupId>com.example.test</groupId> <artifactId>A</artifactId> <version>1.01</version> </dependency> </dependecies>
但执行mvn dependency:tree后,模块B的依赖树显示OkHttp版本为3.14.9:
[INFO] com.example.test:B:jar:1.01 [INFO] +- com.example.test:A:jar:1.01:compile [INFO] | +- com.squareup.okhttp3:okhttp:jar:3.14.9:compile
已排查排除其他模块的3.14.9版本冲突,不想在所有涉及模块中显式声明OkHttp版本,且仅OkHttp出现此版本解析异常,其余依赖均能正常使用指定版本。
解决方案
1. 修复模块A的POM拼写错误
注意到模块A的POM中<dependecies>标签拼写错误(正确应为<dependencies>),这个错误会导致Maven无法识别该依赖块,模块A实际并未引入OkHttp 4.9.2,而是通过其他传递依赖引入了3.14.9版本。修正拼写后执行mvn clean install重新构建模块A即可。
2. 使用Maven依赖锁定统一版本
在项目的父POM中添加<dependencyManagement>块,强制指定OkHttp的版本,所有子模块会自动继承该版本,无需重复声明:
<dependencyManagement> <dependencies> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.2</version> </dependency> </dependencies> </dependencyManagement>
这种方式会绕过Maven的版本仲裁规则,确保全项目使用指定版本。
3. 排查模块A的传递依赖
在模块A目录下执行以下命令,查看OkHttp依赖的具体来源:
mvn dependency:tree -Dverbose -Dincludes=com.squareup.okhttp3:okhttp
如果发现有其他依赖间接引入了3.14.9版本,可以在模块A的OkHttp依赖中排除该传递依赖:
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.2</version> <exclusions> <exclusion> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> </exclusion> </exclusions> </dependency>
内容的提问来源于stack exchange,提问作者Shubham Agrawal
相关产品推荐
相关产品推荐

