为什么在Tomcat上重新部署Web应用程序时会出现ClassNotFoundException

vhmi4jdf  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(261)

我正在开发一个Web应用程序,并将其部署到Tomcat 9.0.73的本地示例。
这工作正常,但我偶尔会遇到这个错误,WAR部署失败。
为什么会这样呢?

13-May-2023 10:14:03.042 SEVERE [main] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [C:\apache-tomcat-9.0.73\webapps\ROOT.war]
        java.lang.IllegalStateException: Error starting child
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:686)
                at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658)
                at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:662)
                at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1023)
                at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1910)
                at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577)
                at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
                at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:824)
                at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
                at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1617)
                at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:318)
                at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
                at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423)
                at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:898)
                at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:795)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322)
                at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:871)
                at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:249)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.StandardService.startInternal(StandardService.java:428)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:917)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.startup.Catalina.start(Catalina.java:772)
                at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
                at java.base/java.lang.reflect.Method.invoke(Method.java:578)
                at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347)
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478)
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
                at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683)
                ... 35 more
        Caused by: java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
                at ch.qos.logback.classic.util.StatusViaSLF4JLoggerFactory.addStatus(StatusViaSLF4JLoggerFactory.java:32)
                at ch.qos.logback.classic.util.StatusViaSLF4JLoggerFactory.addInfo(StatusViaSLF4JLoggerFactory.java:20)
                at ch.qos.logback.classic.servlet.LogbackServletContainerInitializer.onStartup(LogbackServletContainerInitializer.java:32)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4929)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                ... 36 more
        Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
                at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1412)
                at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220)
                ... 41 more
w1jd8yoj

w1jd8yoj1#

事实证明,当WAR的前一版本无法删除时,就会发生这种情况。这是Tomcat在部署WAR文件时给出的警告。如果再次尝试展开,则会导致上述错误。

java.io.IOException: [C:\apache-tomcat-9.0.73\webapps\ROOT] could not be completely deleted. The presence of the remaining files may cause problems

修复方法是在显示警告消息时删除WAR和安装WAR的webapp目录,然后重新尝试部署。
至于为什么WAR文件可能不会被完全删除:它似乎与在浏览器中打开的应用程序相关。因此,在重新部署应用程序之前,请关闭浏览器中的所有页面。
或者,按照this answer中的建议,尝试在Context配置中设置antiResourceLocking="true"

相关问题