gpt4 book ai didi

java - Tomcat 找不到现有的类

转载 作者:行者123 更新时间:2023-11-29 03:51:42 26 4
gpt4 key购买 nike

我有两个配置看似相同的虚拟机(从相同的 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)与需要它的类(例如 RequestContextListener)位于同一个 jar 中。

我在两台机器上都使用 CentOS、Apache 2.2.3、Tomcat 6.0.30 和 Oracle JDK 1.6.0_24。 Tomcat 配置有充足的堆和永久代空间(两台机器上也相同)。


似乎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 上做了同样的事情,但也失败了。所以看起来两台机器在这里没有区别:两者似乎都打开了太多文件。

最佳答案

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

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

关于java - Tomcat 找不到现有的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8476921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com