Вызывают ли провайдеры безопасности утечки ClassLoader в Java? - PullRequest
2 голосов
/ 23 февраля 2012

В моем приложении 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.

1 Ответ

2 голосов
/ 10 марта 2012

Да, похоже, что пользовательский java.security.Provider, зарегистрированный с java.security.Security.addProvider(), вызывает утечку из загрузчика классов, если не отменен с помощью java.security.Security.removeProvider("providerName") при завершении работы приложения.

Я создал проект , целью которого является предотвращение утечек из загрузчика классов, который включает тестовый пример, который доказывает, что это действительно утечка.

Вы можете либо убраться, используя ServletContextListener, как детально здесь , либо просто использовать мой компонент очистки (см. здесь ).

...