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

对于这两个import;

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 

我怎样才能解决这个错误?

该错误是由您的Eclipseconfiguration引起的。 你可以减less它的警告。 更好的是 ,使用不属于非公共API的Base64编码器。 Apache Commons有一个 ,或者当你已经在Java 1.8上的时候,使用java.util.Base64

转到窗口 – >首选项 – > Java – >编译器 – >错误/警告。
select弃用和受限制的API 。 将其更改为警告。
更改禁止劝阻引用,并将其更改为警告。 (或根据您的需要)。

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

然后阅读为什么你不应该使用sun。*包 。

Java 6提供了javax.xml.bind.DatatypeConverter 。 该类提供了两种支持相同解码和编码的静态方法:

parseBase64Binary() / printBase64Binary()

更新:自Java 8以来,我们现在拥有更好的Base64支持。

使用这个,你将不需要额外的库,如Apache Commons Codec

是和sun.misc.BASE64Decoder是慢得多:比java.xml.bind.DatatypeConverter.parseBase64Binary()慢9倍,比org.apache.commons.codec.binary.Base64.decodeBase64()慢4倍,至less对于一个Java 6 OSX上的小string。

以下是我使用的testing程序。 在OSX上使用Java 1.6.0_43:

 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 

没有testingJava 7或其他操作系统。

 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); } } } 

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

项目 – >属性 – > Java构buildpath – >库

将单选button从执行环境切换到Alernate JRE 。 这select相同的jdk1.6.0_37,但清理/build立后,编译错误消失。

也许澄清从公羊回答(3月16日在9:00)必须做些什么。

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

您可以使用访问规则来允许访问这些特定的类,您可以将Eclipseconfiguration为直接使用JDK,或者可以禁用该错误。 你将会隐藏一个严重的错误,因为不应该使用Sun内部类 (参见下面的简短说明)。


自Java 1.8以来,Java在标准API中包含一个Base64类 。 请参阅下面的示例如何使用它:

Java 8导入语句:

 import java.util.Base64; 

Java 8示例代码:

 // 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); 

如果Java 8不可用,则应使用Apache Commons Codec或Guava等库。


孙内部类不应该使用 。 这些类用于实现 Java。 他们已经有公开的方法允许从其他包实例化。 一个良好的构build环境,但保护您使用它们。

使用内部类可能会破坏与未来Java SE运行时的兼容性; 这些类的实现和位置可以在任何时候改变。 应该强烈build议禁用错误或警告。

  1. 转到项目属性中的“生成path”设置。
  2. 删除JRE系统库
  3. 加回来; select“添加库”并selectJRE系统库。 默认为我工作。

这是有效的,因为你在不同的jar文件中有多个类。 删除和重新添加jre lib将使正确的类首先。 如果您想要一个基本的解决scheme,请确保您排除具有相同类的jar文件。

我正在使用unix系统。

在eclipse项目 – >属性 – > Java编译器 – >错误/警告 – >禁止访问(访问规则) – >把它变成警告/忽略(以前它被设置为错误)。

我知道这是很老的post。 因为我们在maven中没有任何sun.misc我们可以很容易的使用

StringUtils.newStringUtf8(Base64.encodeBase64(encVal)); 来自org.apache.commons.codec.binary.Base64

这个错误是因为你正在导入下面两个类import sun.misc.BASE64Encoder; 导入sun.misc.BASE64Decoder ;. Maybe you are using encode and decode of that library like below.

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

是的,而不是sun.misc.BASE64Encoder你可以导入java.util.Base64类 。现在改变以前的编码方法如下

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

现在改变之前的解码方法如下

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

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

添加base64decoder jar,并尝试这些导入:

 import Decoder.BASE64Decoder; import Decoder.BASE64Encoder;