2012-02-23 5 views
2

私はセキュリティプロバイダを登録します。セキュリティプロバイダはJavaでClassLoaderのリークを引き起こしますか?私の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を使用しています。

答えて

2

はい、カスタムjava.security.Providerjava.security.Security.addProvider()に登録されていると、アプリケーションシャットダウン時にjava.security.Security.removeProvider("providerName")の登録が解除されない限り、クラスローダーのリークが発生するようです。

私はa projectを作成しました。これは、クラスローダーのリークを防ぐことを目的としています。これには、これが漏れていることを証明するテストケースが含まれています。

ServletContextListener(詳細はhere)を使用して自分自身をクリーンアップするか、単にクリーンアップコンポーネント(hereを参照)を使用してください。

関連する問題