AlmaLinux下Tomcat9搭配Java8部署WAR包启动报错求助
问题描述
我正在搭建一个包含多Tomcat、多OpenLogic JDK版本的测试环境。将WAR包放入/opt/apache-tomcat-9.0.97/webapps目录并重启服务器后,catalina.out中出现部署失败报错。
报错日志
org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [/opt/apache-tomcat-9.0.97/webapps/name-of.war java.lang.IllegalStateException: Error starting child at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:602) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:571) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:603) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1014) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1866) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:816) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:468) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1584) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:312) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109) at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:389) at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:336) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:776) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:721) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:211) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:415) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:874) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.startup.Catalina.start(Catalina.java:735) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473) Caused by: org.apache.catalina.LifecycleException: Error starting the loader at org.apache.catalina.loader.WebappLoader.startInternal(WebappLoader.java:380) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4314) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:599) ... 37 more Caused by: java.lang.ClassNotFoundException: org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at org.apache.catalina.loader.WebappLoader.createClassLoader(WebappLoader.java:483) at org.apache.catalina.loader.WebappLoader.startInternal(WebappLoader.java:357) ... 41 more
错误解析
核心问题是**java.lang.ClassNotFoundException: org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader**——Tomcat启动Web应用加载器时,找不到Spring框架提供的Tomcat可 instrumentation 类加载器。
常见触发原因:
- 当前运行Tomcat的JDK版本与WAR包依赖的Spring版本不兼容,你提到需要使用
openlogic-openjdk-8u432-b06-linux-x64,说明当前环境JDK版本不符合要求,导致Spring相关类无法正常加载。 - WAR包中缺少
spring-instrument-tomcat依赖,或该依赖版本与Tomcat 9.0.97不匹配。 - Tomcat类加载器配置异常,破坏了默认加载逻辑,导致无法读取WEB-INF/lib下的Spring相关jar包。
解决步骤
- 切换指定JDK版本:
- 下载并解压
openlogic-openjdk-8u432-b06-linux-x64到服务器目录,比如/opt/openlogic-openjdk-8u432-b06-linux-x64 - 编辑Tomcat启动脚本
bin/setenv.sh(无则新建),添加环境变量指定JDK路径:export JAVA_HOME=/opt/openlogic-openjdk-8u432-b06-linux-x64 export PATH=$JAVA_HOME/bin:$PATH - 重启Tomcat,执行
bin/version.sh验证JDK版本是否正确。
- 下载并解压
- 检查WAR包依赖:确认WEB-INF/lib下存在
spring-instrument-tomcat相关jar包,版本需适配Spring框架和Tomcat 9.x。 - 检查Tomcat配置:确保
conf/context.xml中无错误的自定义类加载器配置,避免干扰默认加载逻辑。
内容的提问来源于stack exchange,提问作者Malkavian
相关产品推荐
相关产品推荐

