我正在 Tomcat 7.0.53 中运行 Web 应用程序。我实现了一个 ServletContextListener(将其称为 InitListener)并在 web.xml 中将其正确定义为监听器:
<listener>
<description>listener that initializes common web app/service resources</description>
<listener-class>x.y.z.InitListener</listener-class>
</listener>
在 contextDestroyed 事件期间,我想清理一些代码(例如,使用 close () 关闭 org.jboss.netty.channel.group.ChannelGroup),但我的代码在此方法中总是失败并出现错误:
SEVERE: Exception sending context destroyed event to listener instance of class x.y.z.InitListener
java.lang.NoClassDefFoundError: org/jboss/netty/util/internal/ConcurrentHashMap$Values
现在,如果我已经在 InitListener 的 contextInitialized 部分中使用了 ConcurrentHashMap$Values,例如,通过在 ChannelGroup 上调用 close () ,那么关闭就不会出现问题。
在我看来,在 contextDestroyed 事件期间,Tomcat 无法再加载该类,但如果它已预先加载,那就没有问题。但这不是解决方案,因为我在 contextDestroyed 中使用了其他类,但也存在同样的问题。我必须预先加载我稍后想要使用的所有类。对我来说听起来像是黑客。
我做错了什么?为什么 Tomcat 在这个阶段无法再加载新类?
编辑:作为附加信息,该问题仅在我远程部署 Web 应用程序时发生。当我在 Tomcat 上重新加载或取消部署 Web 应用程序时,它总是会正常关闭。就在远程部署时,关机失败。
最佳答案
我刚刚得到 Tomcat 开发人员的答复。正如 Gimby 已经假设的那样,问题是由于 Tomcat 中的错误造成的。它在 7.0.54 及更高版本中已修复。
感谢您的帮助。
关于java - Tomcat关闭: class loading during contextDestroyed does not work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26466197/