【问题标题】:MD5 MessageDigest not available in system classloaderMD5 MessageDigest 在系统类加载器中不可用
【发布时间】:2013-01-28 17:31:17
【问题描述】:

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

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())

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

【问题讨论】:

    标签: java classloader


    【解决方案1】:

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

    MD5 来自于: 导入 java.security.MessageDigest;

    我还尝试了 SHA - 这对我也很有效。 可能您可以重新检查 java 版本 - 因为旧版本不包括在内,或者您可以通过加载其他算法来检查。像 SHA 什么的?

    我的代码 sn-p 公共 MD5Test(){ 超级(MD5Test.class.getClassLoader()); 尝试 { MessageDigest md = MessageDigest.getInstance("MD5"); System.out.println("我在这里.."); } 捕捉(NoSuchAlgorithmException e){ e.printStackTrace(); }

    【讨论】:

    • 您是否使用自定义类加载器作为系统类加载器 (java.system.class.loader)?
    • 我注意到的另一个奇怪的事情是,当 getInstance("MD5") 和 getInstance("MD5", "SUN") 失败时,getInstance("MD5", new Sun()) 有效!跨度>
    【解决方案2】:

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

    如果您只处理应用程序类路径,而不是 ext 类路径,这正是将会发生的事情(我知道,因为我在编写自定义类加载器时遇到了同样的问题)。

    首先要检查的是类加载请求是否按您的预期进入您的类加载器。是吗?

    【讨论】:

    • 请求来自我的类​​加载器的构造函数,所以它甚至还没有被构造。正如我所看到的,请求应该转到我的类加载器的类加载器,该类加载器应该委托给引导加载器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    相关资源
    最近更新 更多