Spring Boot依赖疑问:升级starter-web为何未更新spring-webmvc?
问题原因
你遇到的核心问题是Maven依赖管理的优先级规则:spring-boot-starter-parent本质是一个BOM(物料清单),它的<dependencyManagement>节点中预定义了所有Spring Boot生态依赖的版本。你的父依赖用的是2.7.10(对应Spring Framework 5.3.x系列),即便你单独将spring-boot-starter-web升级到3.0.5,Maven仍会优先采用父依赖中定义的spring-webmvc 5.3.20版本,因为BOM的版本声明优先级高于直接依赖的传递版本。
正确解决方案
根据你的需求,推荐两种规范的解决方式,优先选择第一种:
1. 统一升级Spring Boot父依赖版本
Spring Boot的starter与核心框架版本是严格绑定的(3.x对应Spring Framework 6.x,2.x对应5.x),跨版本混用starter和父依赖会导致兼容性风险。直接将父依赖版本升级到3.0.5,所有相关依赖会自动对齐到匹配版本,这是最稳妥的方式:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.5</version> <relativePath/> <!-- 从仓库查找父依赖 --> </parent> <!-- 无需再指定spring-boot-starter-web的版本,父依赖已管理 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
注意:Spring Boot 3.x要求JDK 17及以上版本,需要确保你的项目运行环境符合要求。
2. 通过dependencyManagement覆盖版本(不推荐跨版本混用)
如果暂时无法升级整个Spring Boot版本,可在项目的<dependencyManagement>中显式声明spring-webmvc的目标版本,强制Maven使用该版本:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.0.7</version> </dependency> </dependencies> </dependencyManagement>
⚠️ 注意:Spring Framework 6.x与Spring Boot 2.7.x存在API兼容性差异,且Spring 6要求JDK 17+,这种跨版本混用可能引发潜在问题,仅作为临时过渡方案。
关于你当前的解决方式
你直接显式添加spring-webmvc依赖的方式虽然能生效,但并非最优实践:显式依赖会打破Spring Boot的版本管理体系,后续如果有其他依赖传递引入spring-webmvc,可能引发版本冲突,维护成本更高。
内容的提问来源于stack exchange,提问作者user2206366

