从JDK11 Corretto+Spring4.3升级到JDK17 Corretto+Spring6.1启动报错
JDK17 Corretto + Spring6.1升级启动报错:IncompatibleClassChangeError(Jetty HttpURI相关)
错误原因
核心异常java.lang.IncompatibleClassChangeError表明:org.eclipse.jetty.http.HttpURI$Mutable试图实现org.eclipse.jetty.http.HttpURI,但后者是类而非接口。这是典型的Jetty版本冲突问题——不同版本的Jetty中,HttpURI的定义发生了变更(旧版本为接口,新版本改为类,反之亦然),导致类加载时出现不兼容。
解决方案
统一Jetty依赖版本
Spring 6.1需搭配适配JDK17的Jetty版本(推荐Jetty 11.x系列)。在项目依赖管理中统一声明Jetty版本,确保所有Jetty相关组件(如jetty-server、jetty-http、jetty-websocket)版本一致。
Maven示例:<dependencyManagement> <dependencies> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-bom</artifactId> <version>11.0.15</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>排除冲突的Jetty依赖
使用依赖分析工具定位冲突来源:- Maven执行:
mvn dependency:tree - Gradle执行:
./gradlew dependencies
找到引入旧版本Jetty的第三方依赖,在依赖声明中排除对应Jetty组件。示例:
<dependency> <groupId>com.example.legacy-lib</groupId> <artifactId>legacy-lib</artifactId> <version>x.x.x</version> <exclusions> <exclusion> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-http</artifactId> </exclusion> <exclusion> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> </exclusion> </exclusions> </dependency>- Maven执行:
统一Web容器依赖
异常栈同时出现Tomcat(Catalina)和Jetty类,说明项目混合引入了两种容器依赖。根据需求二选一:- 若使用Tomcat:移除所有Jetty相关依赖,确保Spring使用默认的Tomcat容器。
- 若使用Jetty:排除Spring Web starter中的Tomcat依赖,引入Jetty starter。示例:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
清理缓存重新构建
清理本地依赖缓存(Maven的.m2/repository、Gradle的.gradle/caches),重新执行构建命令,确保加载的是最新的兼容版本依赖。
内容的提问来源于stack exchange,提问作者Jinoy Pl
相关产品推荐
相关产品推荐

