MD5 MessageDigest在系统类加载器中不可用

时间:2013-01-28 17:31:18

标签: java classloader

我有一个自定义类加载器,在它的构造函数中我有以下行。

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类。为什么提供程序类不可用?

编辑:

我注意到的一个奇怪的事情是,当以下失败时,

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

这个有效!

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

所以提供程序类毕竟是由引导加载程序加载的,但由于某种原因查找失败。我想知道为什么?

2 个答案:

答案 0 :(得分:1)

我只是尝试在自定义类加载器中加载MD5作为构造函数的一部分,它似乎正常加载。

MD5作为以下内容的一部分: import java.security.MessageDigest;

我也试过SHA - 对我来说也很好用。 可能你可以重新检查java版本 - 因为它没有包含旧版本,或者你可以通过加载其他算法进行检查。像SHA还是什么?

我的代码段     public MD5Test(){     超级(MD5Test.class.getClassLoader());     尝试{     MessageDigest md = MessageDigest.getInstance(“MD5”);     System.out.println(“我在这里......”);     } catch(NoSuchAlgorithmException e){     e.printStackTrace();     }

答案 1 :(得分:1)

你的自定义类加载器可能做错了 - 例如没有从extdirs路径加载,或者没有将类加载请求传递给父类,所以它可以做同样的事情。

如果您只是处理app类路径,而不是ext类路径,那么这就是将要发生的事情(我知道因为我遇到了编写自定义类加载器的相同问题)。

要检查的第一件事是类加载请求正如您所期望的那样进入类加载器。是吗?