添加特定Maven依赖后Tomcat 9部署失败求助
看起来你遇到的核心问题是添加JDA等依赖后,Tomcat的JarScanner在扫描WAR包时出现异常,导致类加载失败,甚至抛出ArrayIndexOutOfBounds错误。结合你的描述和Tomcat 9的特性,我整理了几个针对性的解决方案:
1. 精准跳过有问题的JAR文件(而非全部禁用扫描)
你之前尝试的tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\ *.jar语法有问题,而且完全禁用扫描可能导致Tomcat无法加载必要的容器类或Web应用的核心类。正确的做法是只跳过引发问题的特定依赖JAR:
在catalina.properties中修改配置,列出JDA及相关可能有问题的依赖:
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=jda-*.jar,trove4j-*.jar,opus-java-*.jar,jna-*.jar,nv-websocket-client-*.jar
这样既避免了扫描触发异常的JAR,又保留了对其他必要JAR的扫描能力。
2. 调整Context.xml的JarScanner配置为精准过滤
如果全局配置不生效,可以在Web应用的META-INF/context.xml中添加更细粒度的JarScanner过滤规则:
<Context> <JarScanner scanClassPath="true"> <JarScanFilter defaultPluggabilityScan="false" jarsToSkip="jda-*.jar,opus-java-natives-*.jar" /> </JarScanner> </Context>
这里保留scanClassPath="true"确保必要的类路径扫描,只跳过已知有问题的JDA相关依赖。
3. 排查JDA依赖的嵌套内容与传递依赖
JDA这类Discord开发库通常会引入大量传递依赖,甚至部分依赖可能包含嵌套JAR或格式异常的MANIFEST.MF(比如Class-Path字段有非法字符),这是Tomcat JarScanner崩溃的常见原因:
- 用Maven命令查看依赖树,排除不必要的传递依赖:
比如如果某些依赖是可选的,可以在pom.xml中添加mvn dependency:tree<exclusions>标签排除,减少WAR包中的JAR数量。 - 解压WAR包查看
WEB-INF/lib,检查是否有JAR内部包含其他JAR文件(这类嵌套结构Tomcat扫描时容易出错),如果有,尝试更换为不包含嵌套的依赖版本。
4. 升级Tomcat 9版本
你当前使用的Tomcat 9.0.30是比较早期的版本,后续的Tomcat 9.x版本修复了多个JarScanner相关的Bug(包括ArrayIndexOutOfBounds异常)。建议升级到9.0.65及以上的稳定版本,很多扫描异常会自动解决。
5. 定位具体触发异常的JAR
如果以上方法无效,可以开启Tomcat的Debug日志,查看JarScanner扫描到哪个JAR时抛出异常:
在logging.properties中添加:
org.apache.catalina.util.Scanner.level=FINE
重新部署后,日志会显示扫描的每个JAR,找到触发ArrayIndexOutOfBounds的那个JAR,直接在配置中跳过它即可。
内容的提问来源于stack exchange,提问作者Ethan

