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.miscBASE64Encoder和类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.Encoder和java.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)
一种可能的解决方案是使用--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两个新类来扩充模块,因此现在您可以在运行时使用它们。