升级嵌入式Jetty从9.4.53到12.0.9遇问题求助
问题1:找不到Jetty 12.0.9版本的jetty-annotations、jetty-webapp、jetty-servlets
Jetty 12.x进行了模块化重构,按Java EE版本(EE8/EE9/EE10)拆分了模块,原artifactId不再直接使用。你需要根据项目使用的Servlet版本选择对应模块:
- 若使用Servlet 5.0(Jakarta EE 9):
- jetty-annotations →
org.eclipse.jetty.ee9:jetty-ee9-annotations:12.0.9 - jetty-webapp →
org.eclipse.jetty.ee9:jetty-ee9-webapp:12.0.9 - jetty-servlets →
org.eclipse.jetty.ee9:jetty-ee9-servlets:12.0.9
- jetty-annotations →
- 若使用Servlet 6.0(Jakarta EE 10):
- jetty-annotations →
org.eclipse.jetty.ee10:jetty-ee10-annotations:12.0.9 - jetty-webapp →
org.eclipse.jetty.ee10:jetty-ee10-webapp:12.0.9 - jetty-servlets →
org.eclipse.jetty.ee10:jetty-ee10-servlets:12.0.9
- jetty-annotations →
- 若仍使用Servlet 4.0(Java EE 8):
- jetty-annotations →
org.eclipse.jetty.ee8:jetty-ee8-annotations:12.0.9 - jetty-webapp →
org.eclipse.jetty.ee8:jetty-ee8-webapp:12.0.9 - jetty-servlets →
org.eclipse.jetty.ee8:jetty-ee8-servlets:12.0.9
- jetty-annotations →
确保所有Jetty依赖版本统一为12.0.9,避免混合不同版本导致依赖冲突。
问题2:java.lang.InstantiationError: org.eclipse.jetty.util.Pool及jetty.xml配置错误
这个错误是因为Jetty 12对线程池的实现和配置方式做了大幅修改,同时你的jetty.xml仍使用Jetty 9的DTD,配置逻辑过时。
修正后的jetty.xml配置(适配Jetty 12.0.9)
<?xml version="1.0"?> <Configure id="Server" class="org.eclipse.jetty.server.Server"> <!-- 配置线程池 --> <Set name="threadPool"> <New class="org.eclipse.jetty.util.thread.QueuedThreadPool"> <Set name="minThreads">4</Set> <Set name="maxThreads">200</Set> <Set name="idleTimeout">30000</Set> </New> </Set> </Configure>
关键修改点说明
- 移除Jetty 9的DTD声明:Jetty 12不再依赖旧DTD,使用默认的XML配置解析即可。
- 线程池配置方式变更:Jetty 12中
Server的threadPool需要直接实例化QueuedThreadPool(或其他实现类),而非通过<Get>获取默认实例后修改——旧版本的默认线程池实现类和初始化逻辑已改变,直接获取会导致实例化错误。 - 类路径检查:确保项目中只存在Jetty 12.0.9的
jetty-util依赖,没有残留Jetty 9/11版本的该包,否则会出现类版本冲突。
另外,关于SLF4J的警告和反射性能提示:
- SLF4J绑定为Log4jLoggerFactory是正常现象,若无需调整可忽略;
sun.reflect.Reflection.getCallerClass不支持的警告是Java 17移除了该API导致,若使用的日志框架或Jetty依赖中有调用该方法的代码,建议升级对应依赖版本(比如确保Log4j2版本适配Java 17)。
内容的提问来源于stack exchange,提问作者user2007260
相关产品推荐
相关产品推荐

