【问题标题】:Java 11 : Patch sun.misc.BASE64EncoderJava 11:补丁 sun.misc.BASE64Encoder
【发布时间】:2020-06-04 11:17:11
【问题描述】:

此问题与java.lang.NoClassDefFoundError: sun/misc/BASE64Encoder 不重复。

我正在尝试更新我的应用程序中的 Java 版本(到 11)并且我的应用程序中的一个库使用 sun.misc.BASE64Encoder 类,所以我不可避免地会遇到这个异常:

Caused by: java.lang.ClassNotFoundException: sun.misc.BASE64Encoder
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)

现在,解决方法是使用 java.util.Base64 或 apache commons,正如其他答案所建议的那样。但是,问题是,这个库属于第三方,我没有它的源代码。似乎没有不使用这些类的新版本。所以,为了解决这个问题,我做了以下事情:

  • 创建包sun.misc
  • 复制了此包中的 BASE64EncoderCharacterEncoder

但是现在,我收到一个编译错误,提示 The package sun.misc conflicts with a package accessible from another module: jdk.unsupported

有什么办法可以绕过这个错误吗?如果没有,我可以将jar 添加到包含这些类的依赖项中吗?我只是想确保这些类在运行时可用于该第三方库(通过我自己的源代码或通过将这些类捆绑到其中的 jar)。

【问题讨论】:

  • 您始终可以从 OpenJDK 源代码构建您自己的 JVM。更实用的方法可能是对第 3 方说“修复您的错误库以在 Java 11 上工作......或者我停止支付支持费用”。人们不应该编写代码来依赖内部类。 Sun / Oracle 说这是个坏主意。总有替代方案。

标签: java java-8 base64 deprecated java-11


【解决方案1】:

sun.misc.BASE64Encoder 和 sun.miscBASE64Decoder 的 JDK 11 替代品是 java.util.Base64.Encoderjava.util.Base64.Decoder

JDK 1.8 中的典型代码如下所示:

String encoded = new BASE64Encoder().encode(bBytes);
byte[] decoded = new BASE64Decoder().decodeBuffer(encoded);

会生成相同值的 JDK 11 替代品是:

import java.util.Base64;
// ...
String encoded = Base64.getEncoder().encodeToString(bBytes);
byte[] decoded = Base64.getDecoder().decode(encoded);

【讨论】:

    【解决方案2】:

    一个可能的解决方案是使用--patch-module 参数(如果您可以灵活地更改命令行)。您需要创建一个 JAR,其中包含两个类文件 BASE64Encoder.classCharacterEncoder.class

    base64.jar
        sun
            misc
                BASE64Encoder.class
                CharacterEncoder.class
    

    然后您可以使用以下选项运行您的应用程序:

    java --patch-module jdk.unsupported=base64.jar ...
    

    --patch-module 将为jdk.unsupported 模块增加两个新类,因此现在您可以在运行时使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 2012-05-10
      相关资源
      最近更新 更多