1

カスタムクラスローダーがあり、そのコンストラクターに次の行があります。

MessageDigest.getInstance("MD5")

カスタム クラスローダーをシステム クラスローダーとしてサンプル メイン アプリケーションを実行すると、次のエラーが発生します。

Error occurred during initialization of VM
java.lang.Error: java.security.NoSuchAlgorithmException: MD5 MessageDigest not available
at java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1504)
at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1468)

セキュリティ プロバイダは rt.jar に由来するため、これらのクラスはブートストラップ クラスローダによってロードされる必要があると考えていたので、クラスローダで使用できるはずです。結局、MessageDigest クラスにアクセスできます。プロバイダー クラスが利用できないのはなぜですか?

編集:

私が気づいた奇妙なことの1つは、次の失敗ですが、

getInstance("MD5")
getInstance("MD5", "SUN")

これは機能します!

getInstance("MD5", new sun.security.provider.Sun())

結局、プロバイダー クラスはブートストラップ ローダーによって読み込まれますが、何らかの理由でルックアップが失敗します。なぜだろう?

4

2 に答える 2

1

カスタムクラスローダーのコンストラクターの一部としてMD5をロードしようとしましたが、正常にロードされているようです。

MD5は次の一部として提供されます。importjava.security.MessageDigest;

また、SHAを試しました。これも問題なく機能します。おそらく、Javaバージョンを再確認できます-古いバージョンが含まれていなかったため、または他のアルゴリズムをロードして確認できる可能性があります。SHAか何かのように?

私のコードスニペットpublicMD5Test(){super(MD5Test.class.getClassLoader()); {MessageDigest md = MessageDigest.getInstance( "MD5");を試してください。System.out.println( "ここにいます.."); } catch(NoSuchAlgorithmException e){e.printStackTrace(); }

于 2013-01-28T18:22:08.803 に答える
1

カスタム クラスローダーが間違ったことをしている可能性があります。たとえば、extdirs パスからロードしていない、クラス ロード リクエストを親に渡していないため、同じことができません。

アプリのクラス パスだけを処理し、ext クラス パスを処理しない場合は、まさにこのようなことが起こります (カスタム クラス ローダーを作成する際に同じ問題に遭遇したのでわかります)。

最初に確認することは、クラス ロード リクエストが期待どおりにクラス ローダーに届いていることです。それは...ですか?

于 2013-01-28T19:25:43.210 に答える