Tomcat9部署Spring Boot时WEB-INF/lib存在JAR却报NoSuchFileException
Tomcat9部署Spring Boot应用出现404及JAR文件找不到异常的解决方案
问题现象
- 运行环境:Tomcat 9、Java 11
- 部署Spring Boot应用后,应用显示部署成功,但访问时返回404响应
- 查看Tomcat日志,提示找不到
spring-messaging-5.3.29.jar,但该文件实际存在于WEB-INF/lib目录 - 重新部署后,又出现找不到
spring-boot-starter-data-jpa-2.7.14.jar的情况,推测存在整体异常
异常日志
[Catalina-utility-1] org.apache.catalina.core.StandardContext.listenerStop Exception sending context destroyed event to listener instance of class [ch.qos.logback.classic.$ java.lang.IllegalStateException: java.io.IOException: java.lang.reflect.InvocationTargetException at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.getArchiveEntry(AbstractSingleArchiveResourceSet.java:101) at org.apache.catalina.webresources.AbstractArchiveResourceSet.getResource(AbstractArchiveResourceSet.java:256) at org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:282) at org.apache.catalina.webresources.Cache.getResource(Cache.java:62) at org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:217) at org.apache.catalina.webresources.StandardRoot.getClassLoaderResource(StandardRoot.java:226) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2303) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:865) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1334) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188) at ch.qos.logback.core.ContextBase.getLifeCycleManager(ContextBase.java:260) at ch.qos.logback.core.ContextBase.reset(ContextBase.java:175) at ch.qos.logback.classic.LoggerContext.reset(LoggerContext.java:220) at ch.qos.logback.classic.LoggerContext.stop(LoggerContext.java:348) at ch.qos.logback.classic.servlet.LogbackServletContextListener.contextDestroyed(LogbackServletContextListener.java:36) at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4730) at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5396) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:257) at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:805) at org.apache.catalina.startup.HostConfig.undeploy(HostConfig.java:1424) at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1351) at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1610) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:305) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1151) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1353) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1357) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1335) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: java.io.IOException: java.lang.reflect.InvocationTargetException at org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:236) at org.apache.tomcat.util.compat.JreCompat.jarFileNewInstance(JreCompat.java:162) at org.apache.catalina.webresources.AbstractArchiveResourceSet.openJarFile(AbstractArchiveResourceSet.java:307) at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.getArchiveEntry(AbstractSingleArchiveResourceSet.java:97) ... 34 more Caused by: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.GeneratedConstructorAccessor7.newInstance(Unknown Source) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) at org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:233) ... 37 more Caused by: java.nio.file.NoSuchFileException: /var/lib/tomcat9/webapps/spring-boot/WEB-INF/lib/spring-messaging-5.3.29.jar at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92) at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116) at java.base/sun.nio.fs.UnixFileAttributeViews$Basic.readAttributes(UnixFileAttributeViews.java:55) at java.base/sun.nio.fs.UnixFileSystemProvider.readAttributes(UnixFileSystemProvider.java:149) at java.base/sun.nio.fs.LinuxFileSystemProvider.readAttributes(LinuxFileSystemProvider.java:99) at java.base/java.nio.file.Files.readAttributes(Files.java:1764) at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1259) at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:733) at java.base/java.util.zip.ZipFile$CleanableResource.get(ZipFile.java:850) at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:248) at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:177) at java.base/java.util.jar.JarFile.<init>(JarFile.java:350) ... 41 more
解决方法
1. 修复文件权限
Tomcat运行用户可能没有读取JAR文件的权限,执行以下命令修改:
sudo chown -R tomcat:tomcat /var/lib/tomcat9/webapps/spring-boot/ sudo chmod -R 755 /var/lib/tomcat9/webapps/spring-boot/WEB-INF/lib/
2. 清理Tomcat缓存
Tomcat的资源缓存可能导致无法识别新部署的文件:
- 停止Tomcat服务
- 删除
/var/lib/tomcat9/work/Catalina/localhost/spring-boot目录下的所有内容 - 删除
/var/lib/tomcat9/temp目录下的临时文件 - 重启Tomcat
3. 重新构建部署包
打包过程中可能出现JAR损坏或缺失,重新构建WAR包:
mvn clean package -DskipTests
确认构建无报错后,重新部署到Tomcat。
4. 检查依赖兼容性
虽然Spring Boot 2.7.x与Tomcat 9兼容,但需检查pom.xml中是否存在依赖冲突:
- 确保
spring-messaging、spring-boot-starter-data-jpa等依赖版本统一 - 排查是否有重复引入的依赖,使用
mvn dependency:tree命令查看依赖树,移除冲突依赖
内容的提问来源于stack exchange,提问作者Lecram
相关产品推荐
相关产品推荐

