あなたはおそらくNoClassDefFoundError
. これは、JSSE 実装の既知の問題です。
シナリオは次のとおりです。
- コンテナは、アプリケーション固有の ClassLoader で弾む城のクラスをロードします
- 作成するプロバイダ インスタンスはそのクラスに依存し、その ClassLoader にも依存します。
- 次に、最上位の JVM ClassLoader の静的フィールドのおかげで、プロバイダが JRE API に登録されます。
- 再デプロイ時に、コンテナーはアプリケーションの ClassLoader を破棄して新しいものを作成します
- アルゴリズムは既知であるため、2 番目のプロバイダーの挿入は暗黙のうちに失敗します。
- アルゴリズムを使用する場合、ClassLoader が破棄されているため、プロバイダー インスタンスは単純に使用できません。
- その後、唯一のオプションは、コンテナーを再起動して状況を修正することです。
アンデプロイ イベントの標準リスナーがないため、JSSE プロバイダーの削除をすぐにトリガーすることはできません。
この問題を回避するための推奨される方法は、JVM ClassPath またはコンテナー ClassPath に弾むキャッスル クラスを用意することです。アプリケーションから削除する必要があります。ここで、静的初期化子の代替オプションを使用して BC プロバイダーを登録する必要があります。WebLogic は、サーバーの起動時にコードをトリガーする方法を提供します(私はサーバーの起動クラスを使用しました)。このコードは、サーバー/JVM の有効期間全体にわたって JSSE プロバイダーを登録する役割を果たします。
java.security
別のオプションは、弾む城の jar を含むJRE ファイルに次の行を追加するjre/lib/ext
ことですが、更新時に失われる可能性があるため、この方法は好きではありません。security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider
そのため、アプリケーションは単に実装が存在することを期待します。アルゴリズムの可用性に関するテストを追加して、オペレーターやユーザーに問題を報告することをお勧めします。