Tomcat没有找到现有的类

时间:2011-12-12 15:47:53

标签: java tomcat6

我有两个配置看似相同的虚拟机(从相同的VM模板创建,并且差异化Tomcat文件夹与主机名配置没有区别)。在两台计算机上,都部署了相同的Web应用程序。

一台机器工作正常。在另一台机器上,我收到错误,因为找不到类。我重新启动了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)都与需要它的类位于同一个jar中(例如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)。

更新:我重新启动了失败的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上做了同样的事情,也失败了。因此,这两台机器似乎没有区别:两者似乎都打开了太多文件。

1 个答案:

答案 0 :(得分:4)

超出打开文件的最大数量是我的第一个想法。我还认为'ulimit -n'显示每个用户的最大文件句柄而不是每个进程,但我可能错了。请记住,Tomcat也可能在不同的用户下运行。

我会尝试使用'-verbose:class'启动tomcat,以查看哪些类以及从哪里加载以尝试查看是否存在任何类型的模式。