Java 11:修补sun.misc.BASE64Encoder

问题描述 投票:0回答:1

此问题不是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)。

java java-8 base64 deprecated java-11
1个回答
1
投票

对此的一种可能的解决方案是使用--patch-module自变量(如果您灵活地更改命令行)。您将需要在其中创建两个类文件BASE64Encoder.classCharacterEncoder.class的JAR:

base64.jar
    sun
        misc
            BASE64Encoder.class
            CharacterEncoder.class

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.