Maven Jetty插件TLS 8443配置报错:XML与application.properties配置遇阻
我来帮你搞定这个Maven Jetty插件配置TLS 8443端口的问题!你遇到的org.eclipse.jetty.util.ssl.SslContextFactory.setKeyStore相关错误,多半是配置参数类型不匹配,或者密钥库的路径/配置项写错了——比如把需要File类型的参数写成了字符串,或者密钥库文件压根找不到。
一、官方推荐的XML配置正确姿势
Jetty 9.4.x官方手册里明确推荐用XML做完整配置,咱们一步步来:
1. 先在pom.xml里关联Jetty配置文件
把Jetty插件的配置改成这样,指定咱们要用到的两个XML文件:
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.51.v20230217</version> <!-- 替换成你实际用的Jetty版本 --> <configuration> <jettyXml>src/main/resources/jetty-ssl.xml,src/main/resources/jetty-https.xml</jettyXml> </configuration> </plugin>
2. 创建jetty-ssl.xml配置密钥库
这个文件专门用来配置SslContextFactory,注意参数类型要对应上,别瞎写:
<?xml version="1.0"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd"> <Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory"> <!-- 密钥库路径,这里用项目相对路径,也可以写绝对路径 --> <Set name="keyStorePath"><Property name="jetty.ssl.keyStore" default="src/main/resources/keystore.jks"/></Set> <!-- 密钥库密码,记得改成你自己的 --> <Set name="keyStorePassword"><Property name="jetty.ssl.keyStorePassword" default="changeit"/></Set> <!-- 密钥密码,和密钥库密码相同的话可以省略 --> <Set name="keyManagerPassword"><Property name="jetty.ssl.keyManagerPassword" default="changeit"/></Set> <!-- 信任库配置是可选的,根据你的业务需求加 --> <!-- <Set name="trustStorePath"><Property name="jetty.ssl.trustStore" default="src/main/resources/truststore.jks"/></Set> --> <!-- <Set name="trustStorePassword"><Property name="jetty.ssl.trustStorePassword" default="changeit"/></Set> --> </Configure>
小提示:如果还没有密钥库,用这个keytool命令生成一个测试用的:
keytool -genkey -alias jetty -keyalg RSA -keystore keystore.jks -storepass changeit -keypass changeit
生成后把keystore.jks放到指定的路径下哦。
3. 创建jetty-https.xml配置8443端口
这个文件用来配置HTTPS连接器,把刚才的SslContextFactory关联上去:
<?xml version="1.0"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd"> <Configure id="Server" class="org.eclipse.jetty.server.Server"> <Call 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"> <New class="org.eclipse.jetty.server.HttpConfiguration"> <Set name="secureScheme">https</Set> <Set name="securePort">8443</Set> </New> </Arg> </New> </Item> </Array> </Arg> <Set name="port">8443</Set> </New> </Arg> </Call> </Configure>
二、关于application.properties的坑要注意
你之前尝试用application.properties配置,但Maven Jetty插件本身不支持读取这个文件!这个配置文件是Spring Boot这类框架用来配置自身内嵌容器的,而你用的jetty:run是纯Maven插件命令,插件只会认pom.xml或者Jetty XML配置,所以application.properties在这里根本不起作用,别再浪费时间啦。
三、如果还是报错的排查步骤
要是按上面的步骤来还是出问题,试试这几个排查点:
- 先把密钥库路径改成绝对路径测试,确认文件确实存在
- 检查Jetty插件版本和XML里的DTD版本是否兼容(Jetty 9.4用
configure_9_3.dtd是没问题的) - 看完整的错误栈,确认是参数类型错了还是文件找不到——如果是类型错误,可能是你在XML里用
<Set>时传错了参数类型 - 执行命令时加个
-Djetty.debug=true,比如mvn -e -Djetty.debug=true jetty:run,能拿到更详细的调试日志,方便定位问题
内容的提问来源于stack exchange,提问作者Olga Pshenichnikova

