迁移至Maven后Tomcat启动报InvalidJarIndexError问题求助
问题描述
将基于build.xml构建的Apache Tomcat应用迁移至Maven项目,安装新jar包后Tomcat启动时抛出InvalidJarIndexError: Invalid index错误。catalina.log中错误发生前提示找不到Tomcat Native库,但之前Tomcat正常启动时也有该类日志——旧日志提示与生产环境性能优化相关,新日志提示与OpenSSL相关。已检查系统jar包无损坏,尝试将tomcat-native-2.0.4.jar添加至/usr/local目录后问题依旧。
旧日志
05-Mar-2019 13:56:15.236 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
新日志
22-Jun-2023 18:36:02.206 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path: [/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib]
完整错误堆栈
23-Jun-2023 09:37:19.274 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path: [/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib] 23-Jun-2023 09:37:19.799 SEVERE [main] org.apache.catalina.startup.Catalina.load Error initializing Catalina org.apache.catalina.LifecycleException: Failed to initialize component [StandardServer[8005]] at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:139) at org.apache.catalina.startup.Catalina.load(Catalina.java:724) at org.apache.catalina.startup.Catalina.load(Catalina.java:746) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:305) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:475) Caused by: jdk.internal.util.jar.InvalidJarIndexError: Invalid index at java.base/jdk.internal.loader.URLClassPath$JarLoader.getResource(URLClassPath.java:1051) at java.base/jdk.internal.loader.URLClassPath$JarLoader.getResource(URLClassPath.java:962) at java.base/jdk.internal.loader.URLClassPath$JarLoader.findResource(URLClassPath.java:937) at java.base/jdk.internal.loader.URLClassPath.findResource(URLClassPath.java:296) at java.base/java.net.URLClassLoader$2.run(URLClassLoader.java:629) at java.base/java.net.URLClassLoader$2.run(URLClassLoader.java:627) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.net.URLClassLoader.findResource(URLClassLoader.java:626) at java.base/java.lang.ClassLoader.getResource(ClassLoader.java:1403) at org.apache.tomcat.util.modeler.Registry.loadDescriptors(Registry.java:678) at org.apache.tomcat.util.modeler.Registry.findDescriptor(Registry.java:724) at org.apache.tomcat.util.modeler.Registry.findManagedBean(Registry.java:504) at org.apache.tomcat.util.modeler.Registry.registerComponent(Registry.java:639) at org.apache.catalina.util.LifecycleMBeanBase.register(LifecycleMBeanBase.java:156) at org.apache.catalina.util.LifecycleMBeanBase.initInternal(LifecycleMBeanBase.java:57) at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:994) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) ... 8 more
解决方案
首先明确:Tomcat Native库找不到的日志是INFO级别,属于非致命提示,和本次InvalidJarIndexError错误无关,之前正常启动时也存在该日志,可忽略。
针对InvalidJarIndexError错误,按以下步骤排查:
- 检查jar包索引文件:该错误是JDK读取jar包的
META-INF/INDEX.LIST文件时出错,遍历项目依赖的所有jar包,用unzip -p your.jar META-INF/INDEX.LIST命令检查文件格式,找到异常jar包后重新下载替换。 - 清理Maven缓存:执行
mvn clean install -U命令,强制更新依赖并清理本地仓库中可能损坏的缓存jar包。 - 清理部署目录:删除Tomcat
webapps/your-app/WEB-INF/lib目录下的所有文件,重新部署Maven构建的war包,避免旧build.xml残留的jar包与新依赖冲突。 - 检查JDK与Tomcat兼容性:从堆栈信息判断当前使用Java 17,需确保Tomcat版本为9.0.50+或10+,若版本不匹配则升级Tomcat或调整JDK版本。
关于Tomcat Native库的补充:若要解决该INFO提示,需安装对应系统架构的本地库文件(.so/.dll),而非tomcat-native-2.0.4.jar,将本地库放入java.library.path指定的目录(如/usr/lib64)即可。
内容的提问来源于stack exchange,提问作者RichardFeynman
相关产品推荐
相关产品推荐

