Tomcat 6无法从WEB-INF/lib加载jar包

8
我正在尝试解决Tomcat环境中的配置问题。我们的生产服务器运行Tomcat安装程序,并从共享的NFS挂载中读取war文件。
然而,当我在一个独立的盒子上尝试相同的War(使用他们的配置)时,我得到下面发布的错误。
有趣的是,如果我将WEB-INF / lib中的所有jar文件解压缩到WEB-INF / classes中,这个错误就消失了。
因此,似乎有些东西阻止应用程序加载WEB-INF / lib路径,但我无法找到任何Tomcat设置,会导致它无法检测所包含的Jars,因为它能够检测到应用程序和配置。
有什么想法吗?
严重错误:配置应用程序侦听器类org.springframework.web.context.ContextLoaderListener时出错。java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener 在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)中 在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)中 在org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3786)中 在org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)中 在org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)中 在org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)中 在org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)中 在org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:627)中 在org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:553)中 在org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)中 在org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)中 在org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)中 在org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)中 在org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)中 在org.apache.catalina.core.StandardHost.start(StandardHost.java:719)中 在org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)中 在org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)中 在org.apache.catalina.core.StandardService.start(StandardService.java:516)中 在org.apache.catalina.core.StandardServer.start(StandardServer.java:710)中 在org.apache.catalina.startup.Catalina.start(Catalina.java:578)中 在sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)中 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)中 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中 在java.lang.reflect.Method.invoke(Method.java:597)中 在org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)中 在org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)中
严重错误:配置应用程序侦听器类org.springframework.security.web.session.HttpSessionEventPublisher时出错。java.lang.ClassNotFoundException: org.springframework.security.web.session.HttpSessionEventPublisher 在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)中 在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)中 在org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3786)中 在org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)中 在org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)中 在org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)中 在org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)中 在org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:627)中 在org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:553)中 在org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)中 在org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)中 在org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)中 在org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)中 在org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)中 在org.apache.catalina.core.StandardHost.start(StandardHost.java:719)中 在org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)中 在org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)中 在org.apache.catalina.core.StandardService.start(StandardService.java:516)中 在org.apache.catalina.core.StandardServer.start(StandardServer.java:710)中 在org.apache.catalina.startup.Catalina.start(Catalina.java

3
你的罐子是否通过符号链接引用?默认情况下,Tomcat不会跟随符号链接。 - fge
不,主Web应用程序已通过符号链接连接到部署文件夹,但即使我将整个应用程序放入其中,我仍然会收到此错误。 - liam
2
我指的是WEB-INF/lib中的JAR文件。我曾经因为这个错误而受到足够的打击,以至于非常小心地配置Tomcat... - fge
2个回答

3
所以,我仍然没有为什么会发生这种情况的原因,但我终于能够让它正常工作了。通常,我们使用“unzip”将war文件解压缩到deploy目录中。我改用“jar”,一切都像魔术般地奏效了。
我真的不知道为什么会这样。我尝试了所有其他排列组合(检查我们的部署文件夹、符号链接、权限、所有权等),这是唯一有所不同的事情,即使将两个解压后的文件夹进行比较,它们也是相同的,具有相同的权限,但一个起作用,而另一个却没有。
还值得注意的是:生产部署多年来一直在使用“unzip”。我真的无法理解这一点,但我很高兴我至少可以做其他的事情了。

2

需要注意的是,ClassNotFoundException并不总是意味着找不到指定的类(在您的情况下为org.springframework.web.context.ContextLoaderListener),它也可能意味着无法加载该类。

如果由于任何原因导致特定类无法加载,例如它具有引用另一个未找到的类的静态块,类加载器将报告加载失败为“ClassNotFoundException”。

请确保您的WEB-INF/lib目录中不包含与Tomcat默认库中存在的类/ jar相同的类/ jar。如果存在多个版本,则有时会导致加载失败。通过将jar文件解压缩到classes目录中,您可能正在移动路径顺序中的类,这就是为什么它可以工作的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接