Java 11:补丁 sun.misc.BASE64Encoder

Dar*_*hta 10 java base64 deprecated java-8 java-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)
Run Code Online (Sandbox Code Playgroud)

现在,解决的方法是使用java.util.Base64apache commons,正如其他答案所建议的那样。然而,问题是,这个库属于第三方,我没有它的源代码。似乎没有一个新版本不使用这些类。因此,为了解决这个问题,我执行了以下操作:

  • 已创建包sun.misc
  • 复制此包中的BASE64Encoder和类CharacterEncoder

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

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

Kin*_*xit 13

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);
Run Code Online (Sandbox Code Playgroud)

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

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


Zhe*_*lov 8

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

base64.jar
    sun
        misc
            BASE64Encoder.class
            CharacterEncoder.class
Run Code Online (Sandbox Code Playgroud)

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

java --patch-module jdk.unsupported=base64.jar ...
Run Code Online (Sandbox Code Playgroud)

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