JDK22环境下GlassFish Jersey与Grizzly HttpServer依赖问题求助
解决JDK 22下Grizzly HttpServer启动时的NoSuchFieldError依赖冲突问题
问题根源
从错误栈和依赖树可以明确:Jersey组件版本不统一导致的字段缺失。
你在pom.xml的dependencyManagement中引入的Jersey BOM版本为3.0.2,但直接声明的3个Jersey核心依赖(容器、DI、JSON解析)却指定了3.1.7版本。Maven依赖解析时,BOM的低版本会覆盖部分核心组件(如jersey-common、jersey-server)的版本,最终出现3.0.2和3.1.7混合的依赖环境。
3.1.7版本的JacksonFeature会尝试访问MessageProperties.JSON_MAX_STRING_LENGTH字段,但这个字段是在Jersey 3.1+版本新增的,3.0.2的MessageProperties类中不存在该字段,因此抛出NoSuchFieldError。
解决方案
统一所有Jersey组件的版本,有两种可行方式:
方式1:通过BOM统一管理版本(推荐)
保留BOM的版本管理能力,移除直接依赖中的版本号,让BOM自动同步所有Jersey组件版本:
- 修改
dependencies中的Jersey依赖,删除手动指定的version:
<!-- Grizzly 2 HTTP Server --> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-grizzly2-http</artifactId> </dependency> <!-- Jersey DI and core--> <dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-hk2</artifactId> </dependency> <!-- add jackson as json provider --> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> </dependency>
- 修改
properties中的jersey.version为你需要的统一版本(比如想要用3.1.7):
<jersey.version>3.1.7</jersey.version>
方式2:手动统一所有依赖版本
如果不想使用BOM,直接确保所有Jersey相关依赖的版本完全一致:
将properties中的jersey.version改为3.1.7,同时保持直接依赖的version与该变量一致,确保没有版本差异。
验证修改
执行以下步骤确认修复:
- 清理并重新构建项目:
mvn clean install - 运行
mvn dependency:tree,检查所有org.glassfish.jersey开头的依赖版本是否完全统一,无混合版本情况 - 启动
Main类,验证Grizzly HttpServer可正常启动
内容的提问来源于stack exchange,提问作者David Mescher
相关产品推荐
相关产品推荐

