在我的 Java EE (Glassfish 3.1.1) 应用程序中,我注册了一个安全提供程序:
public static final class XoauthProvider extends Provider {
public XoauthProvider() {
super("Google Xoauth Provider", 1.0, "Provides the Xoauth experimental SASL Mechanism");
put("SaslClientFactory.XOAUTH", "blah.server.utils.XoauthSaslClientFactory");
}
}
...
XoauthProvider xoauthProvider = new XoauthProvider();
Security.addProvider(xoauthProvider);
重新部署后我收到以下异常:
java.lang.IllegalStateException: WEB9031: WebappClassLoader unable to load resource [blah.server.utils.XoauthSaslClientFactory], because it has not yet been started, or was already stopped
我调试了一下,似乎在重新部署后,服务器在加载此类时仍然使用旧的类加载器。
如果我的情况是正确的,并且这是类加载器泄漏,那么在重新部署/取消部署应用程序时取消注册安全提供程序的适当方法是什么?或者我应该在调用最终抛出异常的方法之前手动取消注册/重新注册提供者?
顺便说一句,我正在使用 JRebel。
是的,看来确实有这样的习俗java.security.Provider
注册于java.security.Security.addProvider()
确实会导致类加载器泄漏,除非注销java.security.Security.removeProvider("providerName")
在应用程序关闭时。
我创造了一个专案 https://github.com/mjiderhamn/classloader-leak-prevention/旨在防止类加载器泄漏,其中包括一个测试用例来证明确实存在泄漏。
您可以确保使用清洁剂清洁自己ServletContextListener
,详细说明here http://java.jiderhamn.se/2012/01/01/classloader-leaks-ii-find-and-work-around-unwanted-references/#cleanup,或者只是使用我的清理组件(请参阅here http://java.jiderhamn.se/2012/03/04/classloader-leaks-vi-this-means-war-leak-prevention-library/).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)