Java 关闭tomcat时,Log4j中的异常是什么?

Java 关闭tomcat时,Log4j中的异常是什么?,java,tomcat,log4j,tomcat7,Java,Tomcat,Log4j,Tomcat7,在web应用程序中,我使用log4j。 我使用了一个关闭钩子来终止日志管理器: Runtime.getRuntime().addShutdownHook(new Thread(){ @Override public void run(){ LogManager.shutdown(); } }); 当tomcat关闭时,我在catalina.out中

在web应用程序中,我使用log4j。
我使用了一个
关闭
钩子来终止日志管理器:

Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void run(){
                LogManager.shutdown();              
            }
        });
当tomcat关闭时,我在catalina.out中看到以下异常
这是什么意思?问题是什么?如何解决

INFO: Illegal access: this web application instance has been stopped
already.  Could not load org.apache.log4j.helpers.NullEnumeration. 
The eventual following stack trace is caused by an error thrown for
debugging purposes as well as to attempt to terminate the thread which
caused the illegal access, and has no functional impact. Throwable
occurred: java.lang.IllegalStateException
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
        at org.apache.log4j.Category.getAllAppenders(Category.java:413)
        at org.apache.log4j.Category.closeNestedAppenders(Category.java:226)
        at org.apache.log4j.Hierarchy.shutdown(Hierarchy.java:467)
        at org.apache.log4j.LogManager.shutdown(LogManager.java:267)
        at com.MyLog4jStarter$1.run(Log4JStarterListener.java:133) Exception in thread "Thread-11" java.lang.NoClassDefFoundError:
org.apache.log4j.helpers.NullEnumeration
        at org.apache.log4j.Category.getAllAppenders(Category.java:413)
        at org.apache.log4j.Category.closeNestedAppenders(Category.java:226)
        at org.apache.log4j.Hierarchy.shutdown(Hierarchy.java:467)
        at org.apache.log4j.LogManager.shutdown(LogManager.java:267)
        at de.siemens.icn.hipath.dls.listeners.Log4JInitListener$1.run(Log4JInitListener.java:42)
Caused by: java.lang.ClassNotFoundException:
org.apache.log4j.helpers.NullEnumeration
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1701)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)

出现异常的原因是某些类(例如,
NullEnumeration
)已卸载

向webapp添加钩子的正确方法是实现
javax.servlet.ServletContextListener
,并将此代码添加到
ContextDistromed
方法。您还必须在中的
web.xml

中注册您的侦听器


这可能是由于Tomcat重新加载web应用程序失败造成的。应用程序已卸载,但未正确关闭所有线程。结果,当线程试图运行时,Tomcat已经关闭了它的类加载器,并且记录了一个错误,这一事实使线程受到了打击。最好的修复方法是关闭应用程序的自动webapp重新加载:在Tomcat的server.xml中,找到声明,并确保将其设置为:reloadable=“false”

Ah!!!我在
ServletContextListener
中有此代码,但在
contextInitialized
中没有此代码,因此关闭挂钩转到
contextdestromed
?通常是的,除非您有特殊需要。