如何通过Gradle将Spring Boot 2.7切换至Jetty 10?
核心结论
不用显式声明所有Jetty 10依赖也能完成切换,但必须正确利用Spring Boot的依赖版本管理机制——单纯设置ext['jetty.version']在Gradle里优先级不够,得结合版本属性覆盖或Spring BOM来生效。
为什么你的配置没生效?
Spring Boot 2.7的spring-boot-starter-jetty里,Jetty组件的版本是由Spring Boot的BOM(物料清单)管控的。你直接用ext['jetty.version']设置的版本,优先级低于BOM中定义的Jetty 9版本,所以像jetty-servlets、jetty-webapp这类未被排除的依赖,还是会沿用旧版本。
正确的Gradle配置方案
方案1:通过Spring BOM统一覆盖版本
导入Spring Boot BOM并指定Jetty 10版本,让所有Jetty依赖自动对齐:
plugins { id 'org.springframework.boot' version '2.7.10' id 'io.spring.dependency-management' version '1.0.15.RELEASE' id 'java' } dependencyManagement { imports { mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES } dependencies { dependencySet(group: 'org.eclipse.jetty', version: '10.0.14') { entry 'jetty-servlets' entry 'jetty-webapp' entry 'jetty-server' entry 'jetty-util' // 按需添加其他Jetty核心组件 } } } dependencies { implementation 'org.springframework.boot:spring-boot-starter-jetty' // 排除Jetty 9中与10不兼容的WebSocket依赖(包结构从javax迁移到jakarta) implementation ('org.springframework.boot:spring-boot-starter-jetty') { exclude group: 'org.eclipse.jetty.websocket', module: 'websocket-server' exclude group: 'org.eclipse.jetty.websocket', module: 'javax-websocket-server-impl' } // 若需要WebSocket支持,添加Jetty 10对应依赖 implementation 'org.eclipse.jetty.websocket:websocket-jakarta-server:10.0.14' }
方案2:直接设置全局版本属性
如果不用dependency-management插件,直接把jetty.version设为全局属性,让它优先级高于Spring Boot默认版本:
plugins { id 'org.springframework.boot' version '2.7.10' id 'java' } // 全局设置Jetty版本,覆盖Spring Boot默认值 jetty.version = '10.0.14' dependencies { implementation ('org.springframework.boot:spring-boot-starter-jetty') { exclude group: 'org.eclipse.jetty.websocket', module: 'websocket-server' exclude group: 'org.eclipse.jetty.websocket', module: 'javax-websocket-server-impl' } // 按需添加Jetty 10的WebSocket依赖 implementation 'org.eclipse.jetty.websocket:websocket-jakarta-server:10.0.14' }
针对你疑问的解答
是否无需显式声明Jetty 10依赖即可完成切换?
是的,只要通过版本属性或BOM正确覆盖版本,Spring Boot starter会自动拉取对应版本的Jetty核心依赖。但WebSocket组件因为Jetty 9到10的包结构变更(javax.websocket→jakarta.websocket),需要手动排除旧依赖并添加新的Jetty 10 WebSocket依赖。是否必须使用Spring BOM?
不是必须,但用BOM是最稳妥的方式——它能确保所有Jetty组件版本一致,避免版本冲突。如果不用BOM,直接设置全局版本属性也能生效,但要确保所有Jetty相关依赖都能被这个版本覆盖。
内容的提问来源于stack exchange,提问作者joerg20

