Jetty从9.4.41.v20210516升级至11.0.6后无法启动问题求助
Jetty 11.0.6启动失败问题排查与修复
我帮你排查了Jetty从9.4.41升级到11.0.6后启动失败的问题,主要是配置文件里的几个关键不兼容点和结构错误导致的,下面是具体分析和修复方案:
问题原因分析
- DTD版本不兼容:你当前配置使用的是Jetty 9的DTD声明,Jetty 11已经更新了配置文件的规范,旧DTD会导致解析错误。
- SslContextFactory类拆分:Jetty 11将原有的
org.eclipse.jetty.util.ssl.SslContextFactory拆分为Server和Client两个子类,服务器端必须使用SslContextFactory.Server,否则会初始化失败。 - 配置结构错误:你把
tlsHttpConfig的定义嵌套在了sslContextFactory的配置内部,这是非法的XML结构,Jetty无法正确解析这种嵌套配置。
修复后的完整配置文件
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_10_0.dtd"> <Configure id="Server" class="org.eclipse.jetty.server.Server"> <Call name="addBean"> <Arg> <New class="org.eclipse.jetty.util.thread.ScheduledExecutorScheduler"/> </Arg> </Call> <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration"> <Set name="sendServerVersion"><Property name="jetty.send.server.version" default="false" /></Set> <Set name="sendDateHeader"><Property name="jetty.send.date.header" default="false" /></Set> </New> <!-- 独立定义tlsHttpConfig,不再嵌套在SslContextFactory内 --> <New id="tlsHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration"> <Arg><Ref refid="httpConfig"/></Arg> <Call name="addCustomizer"> <Arg><New class="org.eclipse.jetty.server.SecureRequestCustomizer"/></Arg> </Call> </New> <!-- 使用Jetty 11要求的SslContextFactory.Server类 --> <New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory.Server"> <Set name="KeyStorePath"><SystemProperty name="mcruncher.app.dataDir" default="."/>/<Property name="jetty.keystore" default="temp/keystore.jks"/></Set> <Set name="KeyStorePassword"> <Property name="jetty.keystore.password" default=""/> </Set> <Set name="EndpointIdentificationAlgorithm"></Set> <Set name="IncludeProtocols"> <Array type="String"> <Item>TLSv1.2</Item> </Array> </Set> <Set name="IncludeCipherSuites"> <Array type="String"> <Item>TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384</Item> <Item>TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384</Item> </Array> </Set> </New> <Call id="sslConnector" name="addConnector"> <Arg> <New class="org.eclipse.jetty.server.ServerConnector"> <Arg name="server"><Ref refid="Server" /></Arg> <Arg name="factories"> <Array type="org.eclipse.jetty.server.ConnectionFactory"> <Item> <New class="org.eclipse.jetty.server.SslConnectionFactory"> <Arg name="next">http/1.1</Arg> <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg> </New> </Item> <Item> <New class="org.eclipse.jetty.server.HttpConnectionFactory"> <Arg name="config"><Ref refid="tlsHttpConfig"/></Arg> </New> </Item> </Array> </Arg> <Set name="port"><Property name="jetty.port" default="9090" /></Set> <Set name="idleTimeout"><Property name="jetty.idleTimeout" default="30000"/></Set> <Set name="soLingerTime"><Property name="jetty.soLingerTime" default="-1"/></Set> </New> </Arg> </Call> </Configure>
关键修改点说明
- 更新DTD声明:将原Jetty 9的DTD替换为Jetty 10/11兼容的DTD,确保配置文件能被正确解析。
- 修正SslContextFactory类:将
org.eclipse.jetty.util.ssl.SslContextFactory改为org.eclipse.jetty.util.ssl.SslContextFactory.Server,这是Jetty 11服务器端SSL配置的强制要求。 - 调整配置结构:把
tlsHttpConfig从sslContextFactory内部移出来,作为独立的配置节点,符合Jetty配置文件的结构规范。 - 优化路径写法:将路径中的反斜杠
\改为正斜杠/,这种写法在Windows和Linux系统下都能正常工作,避免转义问题。
按照这个配置修改后,你的Jetty 11.0.6服务器应该就能正常启动了。
内容的提问来源于stack exchange,提问作者Pitchu
相关产品推荐
相关产品推荐

