Spring Boot与Maven依赖版本维护原理探究(以Jackson为例)
jackson-bom.version统一升级Jackson版本 我想要升级jackson-databind版本,在如下pom.xml配置中,未直接定义jackson-databind的版本,仅配置了jackson-bom.version为2.15.2,却成功将jackson-databind版本升级至2.15.2,甚至Spring关联的Jackson版本也同步升级。想了解Spring Boot实现这一依赖版本维护的原理。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.0</version> </parent> <properties> <jackson-bom.version>2.15.2</jackson-bom.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> </dependencies>
核心原理拆解
Spring Boot Starter Parent 的依赖管理基础
spring-boot-starter-parent是一个预配置的父POM,它通过<dependencyManagement>节点集中管控了几乎所有常用第三方依赖的版本,其中就包含Jackson系列组件的版本规则。它内部默认引入了与当前Spring Boot版本适配的Jackson BOM。属性覆盖实现版本切换
在spring-boot-starter-parent的POM中,已经预先定义了jackson-bom.version属性,用来指定引入的Jackson BOM版本。当你在自己的项目POM中重新赋值该属性时,会直接覆盖父POM的默认值,让项目加载你指定版本的Jackson BOM。Jackson BOM的统一版本管控能力
Jackson BOM本质是一个专门管理Jackson组件版本的POM,它在自身的<dependencyManagement>中声明了所有Jackson核心组件(如jackson-databind、jackson-core、jackson-annotations)的统一版本。项目引入该BOM后,所有直接或间接依赖的Jackson组件都会自动沿用BOM中定义的版本,无需在单个依赖中重复声明版本号。传递依赖的版本自动覆盖
像spring-boot-starter-web这类starter会间接依赖Jackson组件,由于项目通过jackson-bom.version指定了更高版本的Jackson BOM,Maven在依赖解析时会优先采用BOM定义的版本,自动替换starter原本依赖的Jackson版本,最终实现所有关联Jackson组件的版本同步升级。
内容的提问来源于stack exchange,提问作者Bellyr

