Import sun.misc.BASE64Encoder 导致在 Eclipse 中编译错误

对于这两种进口;

import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;

我得到了这个错误:

Access restriction: The type BASE64Decoder is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar

如何解决此错误?

273304 次浏览

当然,只是不要使用 Sun base64编码器/解码器。还有很多其他的选择,包括 Apache 编解码器或这个 公共领域的实施

然后读 为什么你不应该使用 Sun. * 软件包

该错误是由 Eclipse 配置引起的。你可以把它简化成一个警告。使用不属于非公共 API 的 Base64编码器。Apache Commons 有 ,或者当您已经使用 Java 1.8时,可以使用 java.util.Base64

转到窗口—— > 首选项—— > Java —— > 编译器—— > 错误/警告。
选择 废弃和受限制的 API,将其更改为 < strong > police。
更改 禁止气馁了引用并将其更改为警告(或根据您的需要)

这个类提供了两个静态方法,它们支持相同的解码和编码:

parseBase64Binary() / printBase64Binary()

更新: 从 Java8开始,我们现在有了更好的 基地64支持。

使用它,您将不需要额外的库,如 Apache Commons Codec

是的,而且 sun.misc.BASE64解码器要慢得多: 比 java.xml.bind 慢9倍。ParseBase64Binary () ,比 org.apache.commons.codec.bin 慢4倍。至少对于 Java 6 OSX 上的一个小字符串来说是这样的。

下面是我使用的测试程序:

john:password = am9objpwYXNzd29yZA==
javax.xml took 373: john:password
apache took    612: john:password
sun took       2215: john:password

顺便说一下,这是 commons-codec 1.4。1.7似乎变慢了:

javax.xml took 377: john:password
apache took    1681: john:password
sun took       2197: john:password

没有测试 Java7或其他操作系统。

import javax.xml.bind.DatatypeConverter;
import org.apache.commons.codec.binary.Base64;
import java.io.IOException;


public class TestBase64 {
private static volatile String save = null;
public static void main(String argv[]) {
String teststr = "john:password";
String b64 = DatatypeConverter.printBase64Binary(teststr.getBytes());
System.out.println(teststr + " = " + b64);
try {
final int COUNT = 1000000;
long start;
start = System.currentTimeMillis();
for (int i=0; i<COUNT; ++i) {
save = new String(DatatypeConverter.parseBase64Binary(b64));
}
System.out.println("javax.xml took "+(System.currentTimeMillis()-start)+": "+save);
start = System.currentTimeMillis();
for (int i=0; i<COUNT; ++i) {
save = new String(Base64.decodeBase64(b64));
}
System.out.println("apache took    "+(System.currentTimeMillis()-start)+": "+save);
sun.misc.BASE64Decoder dec = new sun.misc.BASE64Decoder();
start = System.currentTimeMillis();
for (int i=0; i<COUNT; ++i) {
save = new String(dec.decodeBuffer(b64));
}
System.out.println("sun took       "+(System.currentTimeMillis()-start)+": "+save);
} catch (Exception e) {
System.out.println(e);
}
}
}
  1. 转到项目属性中的“生成路径”设置。
  2. 删除 JRE 系统库
  3. 添加回来,选择“添加库”,并选择 JRE 系统库。默认工作。

这可以工作,因为在不同的 jar 文件中有多个类。删除并重新添加 jre 库将使正确的类成为第一个。如果您想要一个基本的解决方案,请确保排除具有相同类的 jar 文件。

我在 jdk1.6.0 _ 37上遇到了这个问题。 这是我的系统上唯一的 JDE/JRE。我不知道为什么,但是下面解决了这个问题:

项目-> 属性-> Java 构建路径-> 库

将单选按钮从 行刑环境切换到 注意 JRE。 这将选择相同的 jdk1.6.0 _ 37,但是在 clean/build 之后,编译错误消失了。

也许来自 公羊(3月16日9:00)的回答澄清必须对此做些什么。

我正在使用 Unix 系统。

在 eclipseproject-> Properties-> Java Compiler-> Errors/Police-> 禁止访问(访问规则)-> 将其转为警告/忽略(之前设置为 Error)。

发生此错误(或在以后的版本中发出警告)是因为您正在针对 Java 执行环境进行编译。这在 EclipseJava 项目的 Build 路径中显示为 JRE System library [CDC-1.0/Foundation-1.0]。这样的环境只公开 Java 标准 API,而不是运行时中的所有类。这意味着用于 执行 Java 标准 API 的类不会公开。

您可以使用访问规则允许访问这些特定的类,您可以将 Eclipse 配置为直接使用 JDK,或者您可以禁用该错误。然而,您将隐藏一个严重的错误作为 不应该使用 Sun 内部类(参见下面的简短解释)。


自 Java 1.8以来,Java 在标准 API 中包含了一个 Base64:

Java8汇入声明:

import java.util.Base64;

Java8示例代码:

// create a byte array containing data (test)
byte[] binaryData = new byte[] { 0x64, 0x61, 0x74, 0x61 };
// create and configure encoder (using method chaining)
Base64.Encoder base64Encoder = Base64.getEncoder().withoutPadding();
// encode to string (instead of a byte array containing ASCII)
String base64EncodedData = base64Encoder.encodeToString(binaryData);


// decode using a single statement (no reuse of decoder)
// NOTE the decoder won't fail because the padding is missing
byte[] base64DecodedData = Base64.getDecoder().decode(base64EncodedData);

如果 Java8不可用,则应使用 Apache Commons 编解码器番石榴等库。


Sun 内部类不应该使用 。这些类用于 执行 Java。他们使用公共方法来允许从其他包实例化。然而,一个好的构建环境 应该可以保护您不使用它们。

使用内部类可能会破坏与未来 JavaSE 运行时的兼容性; 这些类的实现和位置可能随时发生变化。应该强烈劝阻禁用该错误或警告(但禁用该错误是在以前的答案中建议的,包括两个最受欢迎的答案)。

我知道这是很老的邮件。因为我们没有任何东西,在 Maven 我们可以很容易地使用

NewStringUtf8(Base64.encodeBase64(encVal)) ; 来自 org.apache.comms.codec.biny.Base64

这个错误是因为您正在导入以下两个类 Import sun.misc.BASE64Encoder; import sun.misc.BASE64Decder; .

new BASE64Encoder().encode(encVal);
newBASE64Decoder().decodeBuffer(encryptedData);

是的,而不是 sun.misc.BASE64编码器,你可以导入 现在将以前的 encode 方法更改如下:

encryptedData=Base64.getEncoder().encodeToString(encryptedByteArray);

现在改变以前的解码方法,如下所示

byte[] base64DecodedData = Base64.getDecoder().decode(base64EncodedData);

现在一切都完成了,您可以保存程序并运行。它将运行而不显示任何错误。

添加 base64解码器 jar 并尝试以下导入:

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;

注意,在 JDK-13中不提供 sun.misc.BASE64Decoder

解决方案: 进入 java 8 sdk fodler,从 jre lib rt.jar 拷贝到 sdklib.jar (它在 Eclipse 文件夹的某个地方)类(具有相同的路径) :

Sun/misc/BASE64Decoder.class,
Sun/misc/BASE64Encoder.class,
Sun/misc/PersonterDecoder.class,
Sun/misc/PersonterEncoder.class

仅此而已

在日食的时候收到 sun.misc.base64encoder cannot be resolved to a type

  1. 通过指向 eclipse 使用安装在 system-上的 Java 版本1.8解决了这个问题 Windows-> 首选项-> Java-> 安装的 JRE-> 添加 jre 路径(例如: C: Program Files Java jdk1.8.0 _ 271)

  2. 右键单击 project-> Maven-> Update project

到时候问题就解决了。