3

在我的 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

我调试了一下,似乎重新部署后,服务器在加载这个类时仍然使用旧的类加载器。

如果我的情况是正确的,并且它是 ClassLoader 泄漏,那么在重新部署/取消部署应用程序时注销安全提供程序的适当方法是什么?还是我应该在调用最终引发异常的方法之前手动取消注册/重新注册提供程序?

顺便说一句,我正在使用 JRebel。

4

1 回答 1

4

是的,似乎自定义java.security.Provider注册java.security.Security.addProvider()确实会导致类加载器泄漏,除非java.security.Security.removeProvider("providerName")在应用程序关闭时取消注册。

我创建了一个旨在防止类加载器泄漏的项目,其中包括一个证明这确实泄漏的测试用例。

您可以确保使用 a 来清理自己ServletContextListener,详见此处,或者直接使用我的清理组件(请参阅此处)。

于 2012-03-09T21:34:33.190 回答