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

时间:2011-04-05 08:58:10

标签: java 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

如何解决此错误?

13 个答案:

答案 0 :(得分:123)

转到窗口 - >首选项 - > Java - >编译器 - >错误/警告。
选择已弃用且受限制的API 。将其更改为警告。
更改禁止气馁参考并将其更改为警告。 (或根据需要。)

答案 1 :(得分:59)

该错误是由Eclipse配置引起的。您可以将其减少为警告。 Better still,使用不属于非公共API的Base64编码器。 Apache Commons有one,或者当您已经使用Java 1.8时,请使用java.util.Base64

答案 2 :(得分:34)

当然 - 只是不要使用Sun base64编码器/解码器。还有很多其他选项,包括Apache Codec或此public domain implementation

然后阅读why you shouldn't use sun.* packages

答案 3 :(得分:24)

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

parseBase64Binary() / printBase64Binary()

<强>更新 从Java 8开始,我们现在有了更好的Base64支持。

使用此功能,您不需要额外的库,例如Apache Commons Codec

答案 4 :(得分:5)

Yup和sun.misc.BASE64Decoder比较慢:比java.xml.bind.DatatypeConverter.parseBase64Binary()快9倍,比org.apache.commons.codec.binary.Base64.decodeBase64()慢4倍,at至少对于Java 6 OSX上的小字符串。

以下是我使用的测试程序。在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

未测试Java 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);
        }
    }
}

答案 5 :(得分:5)

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

  

项目 - &gt;属性 - &gt; Java构建路径 - &gt;库

     

将单选按钮从执行环境切换为 Alernate JRE 。   这选择了相同的jdk1.6.0_37,但在clean / build之后编译错误消失了。

ram (3月16日9:00)的答案中澄清可能需要做些什么。

答案 6 :(得分:3)

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

您可以使用访问规则允许访问这些特定类,您可以将Eclipse配置为直接使用JDK,也可以禁用该错误。然而,您将隐藏一个严重错误Sun internal classes shouldn't be used(请参阅下面的简短说明)。


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

Java 8 import语句:

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 CodecGuava等库。


Sun internal classes shouldn't be used。这些类用于实现 Java。他们有公共方法允许从其他包中实例化。一个良好的构建环境,但应该保护您不使用它们。

使用内部类可能会破坏与未来Java SE运行时的兼容性;这些类的实现和位置可以随时改变。强烈建议不要禁用错误或警告。

答案 7 :(得分:2)

  1. 转到项目属性中的“构建路径”设置。
  2. 删除JRE系统库
  3. 加回来;选择“添加库”并选择JRE系统库。默认对我有效。
  4. 这是有效的,因为您在不同的jar文件中有多个类。删除和重新添加jre lib将使正确的类成为第一个。如果您想要一个基本的解决方案,请确保使用相同的类排除jar文件。

答案 8 :(得分:1)

我正在使用unix系统。

在eclipse项目中 - &gt;属性 - &gt; Java编译器 - &gt;错误/警告 - &gt;禁止访问(访问规则) - &gt;将其转为警告/忽略(以前将其设置为错误)。

答案 9 :(得分:1)

请注意,sun.misc.BASE64Decoder在JDK-13中不可用

答案 10 :(得分:0)

我知道这是非常老的帖子。因为我们在maven中没有任何东西sun.misc 我们可以轻松使用

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

答案 11 :(得分:0)

此错误是因为您导入了两个类以下 import sun.misc.BASE64Encoder; import 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 class 。现在更改以前的编码方法

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

现在更改以前的解码方法

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

现在一切都完成了,你可以保存程序并运行。它会在没有显示任何错误的情况下运行。

答案 12 :(得分:0)

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

//Try to replace "yolo" with a float.
System.out.println(String.format("%6.2f", "yolo"));