启动Jetty服务遇类重复扫描警告,求无需重编WAR的解决办法
解决Jetty 9中JSTL类重复扫描的警告问题
这个警告的核心原因是:Jetty全局lib目录下的org.apache.taglibs.taglibs-standard-impl-1.2.5.jar,与你部署的WAR包内WEB-INF/lib/jstl-1.2.jar包含了完全相同的JstlXmlTLV$Handler类,Jetty的注解扫描器检测到同一类被多个JAR包提供,因此抛出警告。由于类加载顺序的不确定性,才会出现服务有时正常、有时告警的情况。
以下是无需重新编译WAR包的解决办法:
方法1:移除Jetty全局的apache-jstl模块
既然你的WAR包已经自带了JSTL依赖,完全可以让Jetty不再加载全局的JSTL实现包,从根源避免冲突:
- 停止Jetty服务:
sudo jetty.sh stop - 禁用Jetty的apache-jstl模块:
java -jar /opt/jetty/start.jar --disable-module=apache-jstl - 重新启动Jetty:
sudo jetty.sh start
此时Jetty只会使用WAR包内自带的JSTL依赖,不会再出现重复类扫描的警告。
方法2:配置Jetty类加载规则,指定JSTL类的优先加载来源
如果不想改动Jetty全局模块,可以给该WAR包单独配置类加载策略:
- 在Jetty的
webapps目录下创建SGW.xml文件(与你的WAR包同名),内容如下:
若想优先使用WAR包内的JSTL类,只需把<Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/SGW</Set> <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/SGW.war</Set> <!-- 让Jetty优先加载全局的JSTL类,忽略WAR包内的对应类 --> <Call name="prependServerClass"> <Arg>-org.apache.taglibs.standard</Arg> </Call> </Configure><Arg>-org.apache.taglibs.standard</Arg>改为<Arg>org.apache.taglibs.standard</Arg>。 - 重启Jetty服务,配置会自动生效。
方法3:仅抑制警告(不推荐,治标不治本)
如果只是不想看到警告日志,可以在Jetty的start.ini文件中添加以下配置:
jetty.annotations.skipDuplicateScans=true
该配置会让Jetty跳过重复类的扫描告警,但不会解决潜在的类加载冲突问题,仅建议作为临时方案。
关于你之前尝试方法失效的原因
- 修改WAR包内的
pom.xml但未重新打包:WAR包内的依赖JAR是编译时就打包进去的,仅修改pom.xml不会移除已存在的jstl-1.2.jar,冲突依然存在。 - 删除WAR包内的
jstl-1.2.jar:Jetty全局的org.apache.taglibs.taglibs-standard-impl-1.2.5.jar与WAR包依赖的JSTL版本存在兼容性差异,导致页面渲染时缺失必要的类或标签,从而出现网页异常。
结论
不需要必须使用Maven插件重新编译WAR包,通过上述方法1或方法2,无需修改WAR包内容即可解决类重复扫描的警告问题,同时避免网页异常。
内容的提问来源于stack exchange,提问作者권순욱
相关产品推荐
相关产品推荐

