【发布时间】: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 - 复制了此包中的
BASE64Encoder和CharacterEncoder类
但是现在,我收到一个编译错误,提示 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