我有两个看起来完全相同的虚拟机(从相同的虚拟机模板创建,区分Tomcat文件夹与主机名配置无关)。在这两台机器上,都部署了相同的Web应用程序。Tomcat没有找到现有类
一台机器工作正常。在另一台机器上,我得到错误,因为没有找到类。我重新启动了tomcat 3次,并且在不同的应用程序中总是得到不同的错误。一个这样的错误是这样的:
java.lang.NoClassDefFoundError: org/springframework/web/context/request/ServletRequestAttributes
org.springframework.web.context.request.RequestContextListener.requestInitialized(RequestContextListener.java:64)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776)
org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705)
org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
java.lang.Thread.run(Thread.java:662)
在这种错误的每一次出现至今,丢失类(例如ServletRequestAttributes
)驻留在同一罐为需要它(例如RequestContextListener
)的类。
我在两台机器上都使用CentOS,Apache 2.2.3,Tomcat 6.0.30和Oracle JDK 1.6.0_24。 Tomcat配置了大量的堆和perm gen空间(两台机器也相同)。
看来Tomcat 6 "losing" classes in production是一个类似的问题,但目前还没有解决方案。
一个可能存在的问题是“您可能已达到操作系统中打开的文件句柄的最大数量”。与最基本的Linux知识,我成功地执行在互联网上发现了一些命令,告诉我,
- 最大文件句柄是6815744在两台机器上(
cat /proc/sys/fs/file-max
) - 当前使用情况是10710的失败和10200正确的机器(
cat /proc/sys/fs/file-nr
),对每个进程 - 最大文件句柄是1024(
ulimit -n
),被Tomcat - 当前使用情况是641的失败和686正确的机器(
lsof -p <TOMCAT-PID> | wc -l
)上。
UPDATE:我重新启动Tomcat的失败,并在浏览器在一旦打开的所有应用程序。 Tomcat的的文件使用率上升到1926年。现在我看到的NoClassDefFoundError在几乎每一个应用程序,我也看到了一个日志文件此消息:
2011-12-12 18:38:36,225 ERROR [TP-Processor3] [rplansecurity] org.jasig.cas.client.validation.Cas20ServiceTicketValidator java.net.SocketException: Too many open files
java.net.SocketException: Too many open files
at java.net.Socket.createImpl(Socket.java:397) ~[na:1.6.0_24]
我做了正确的Tomcat一样的,但是失败也是。所以这两台机器似乎没有区别:两者似乎都打开了太多的文件。
您正在使用哪个JDK? Oracle或OpenJDK或GCJ? GCJ很麻烦。 – BalusC
你确定这个jar在启动tomcat时在JVM类路径中吗?尝试“ps -ef | grep'tomcat'”,甚至连接visualVM/jconsole以查看类路径。这是很好,你有一个相同的应用程序工作。你所要做的就是比较两个类路径 – dimitrisli
@BalusC我正在使用Oracle JDK。 –