Jetty 12.x升级启动报错:NoSuchMethodError: ServerConnector.setSoLingerTime(int)
问题分析与解决方案
问题原因
java.lang.NoSuchMethodError 是因为 Restlet 2.4.1 的 Jetty 扩展依赖旧版 Jetty API,而你升级到的 Jetty 12.0.8 属于重大版本迭代,API 发生了破坏性变更:
- Jetty 9.x 中
ServerConnector.setSoLingerTime(int)方法在 Jetty 12 里已被移除,相关配置逻辑移至SocketConfiguration.setSoLinger(int)中 - Restlet 2.4.1 的
JettyServerHelper仍在调用旧方法,导致运行时无法找到对应方法
解决方案
方案1:升级Restlet到支持Jetty 12的版本
Restlet 2.4.x 仅适配 Jetty 9.x 系列,若要使用 Jetty 12,需将 Restlet 升级到 3.2.x 及以上版本(Restlet 3.2 开始适配 Jetty 10+,Jetty 12 属于最新分支,建议使用 Restlet 最新稳定版)。
修改 pom.xml 中的 Restlet 依赖:
<dependency> <groupId>org.restlet.jse</groupId> <artifactId>org.restlet.ext.jetty</artifactId> <version>3.2.0</version> <!-- 替换为支持Jetty 12的版本 --> </dependency>
同时需同步升级其他 Restlet 核心依赖到对应版本,避免版本不一致引发新问题。
方案2:降级Jetty到Restlet 2.4.1兼容的版本
如果暂时无法升级 Restlet,需将 Jetty 版本降级到 9.4.x 系列(Restlet 2.4.1 官方适配的 Jetty 版本),修改 pom.xml 中所有 Jetty 依赖的版本:
<dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-client</artifactId> <version>9.4.52.v20230823</version> <!-- 9.4.x最新稳定版 --> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> <version>9.4.52.v20230823</version> </dependency> <!-- 其他Jetty依赖同步修改版本 -->
方案3:自定义JettyServerHelper(临时应急方案)
若必须同时使用 Restlet 2.4.1 和 Jetty 12,可自定义 JettyServerHelper 重写 createConnector 方法,替换旧 API 调用:
- 复制原
JettyServerHelper代码到项目中 - 修改
createConnector中调用setSoLingerTime的逻辑:// 原代码 // connector.setSoLingerTime(lingerTime); // 替换为Jetty 12的API connector.getSocketConfiguration().setSoLinger(lingerTime); - 通过 Restlet 的 SPI 机制配置使用自定义的 Helper 实现
此方法需要维护自定义代码,后续升级 Restlet 时需同步更新,仅建议临时应急使用。
内容的提问来源于stack exchange,提问作者Roopchand
相关产品推荐
相关产品推荐

