一、现象
1.实现了一个框架包,其父包控制了okhttp版本号。
java"> <dependencyManagement><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.7</version></dependency>
</dependencyManagement>
2.外部服务引用引用此框架包。
java"> <dependency><groupId>com.xx.open</groupId><artifactId>xx-open-client</artifactId><version>4.4.4-SNAPSHOT</version></dependency>
然后查看okhttp的版本号为4.9.3,而不是框架内指定的版本号。
二、原因分析
由于外部服务的父包引入了springboot的IMPORT的BOM表单定义,而springboot的 dependies又定义了okhttp的版本号所致。
父包
java"> <dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.18</version><type>pom</type><scope>import</scope></dependency>
springboot dependenies
java"> <okhttp.version>4.9.3</okhttp.version><dependencyManagement> <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp-bom</artifactId><version>${okhttp.version}</version><type>pom</type><scope>import</scope></dependency>
三、总结
自身父包定义的组件版本号优先级高于外包部间接依赖的父包中定义的组件版本号。