Tomcat 7.0.92搭配JDK11启动报错:无法处理tools.jar注解扫描
这个问题我之前也碰到过——Tomcat 7的Jar扫描逻辑在JDK11环境下会默认尝试查找tools.jar,但JDK11已经移除了这个文件(JDK9+采用模块化后,tools.jar的内容被整合到了系统模块里),所以才会抛出NoSuchFileException。你之前用jarsToSkip=*.jar没生效,大概率是因为这个配置没有覆盖到Tomcat对系统类路径中jar的扫描逻辑,下面给你几个可行的解决办法:
1. 精准跳过tools.jar的扫描
不用粗暴地跳过所有jar,直接在CATALINA_BASE/conf/catalina.properties里修改两个关键属性,确保Tomcat不会去扫描不存在的tools.jar:
# 针对ContextConfig的注解扫描跳过tools.jar org.apache.catalina.startup.ContextConfig.jarsToSkip=tools.jar # 针对默认JarScanner的扫描跳过tools.jar tomcat.util.scan.DefaultJarScanner.jarsToSkip=tools.jar
如果之前已经有这两个属性,直接把tools.jar追加到现有值后面就行(用逗号分隔多个jar)。
2. 禁用不必要的注解扫描(适合不需要注解自动加载的应用)
如果你的Web应用不需要依赖Tomcat自动扫描注解来初始化组件,可以直接在应用的META-INF/context.xml(没有的话新建一个)里添加Jar扫描的禁用配置:
<Context> <!-- 完全禁用Jar扫描,避免Tomcat去扫系统类路径的jar --> <JarScanner scanClassPath="false" scanManifest="false"/> </Context>
或者更精准地,只禁用注解相关的扫描:
<Context> <JarScanner> <JarScanFilter defaultJarScanFilter="false"/> </JarScanner> </Context>
这个方法能从根源上阻止Tomcat去扫描任何jar的注解,自然也不会触发tools.jar的错误。
3. 升级Tomcat版本(长期最优解)
Tomcat 7虽然在7.0.92版本开始提供对JDK11的支持,但毕竟是比较老旧的版本,对JDK9+的模块化适配不够完善。如果条件允许,建议升级到Tomcat 9(和Tomcat 7的API兼容性较好,迁移成本低)或者Tomcat 10,这些版本默认就不会去扫描不存在的tools.jar,而且对JDK11的支持更全面,后续也能避免更多类似的兼容性问题。
为什么之前的jarsToSkip=*.jar没生效?
Tomcat的jarsToSkip属性默认主要作用于WEB-INF/lib目录下的jar,而它尝试扫描的tools.jar是在系统类路径(JDK的lib目录)里,所以全局设置*.jar并没有覆盖到系统类路径的扫描逻辑,必须明确指定跳过tools.jar才行。
修改完配置后重启Tomcat,检查启动日志,应该就不会再出现那个NoSuchFileException错误了。
内容的提问来源于stack exchange,提问作者user3820339

