【问题标题】:import sun.misc.BASE64Encoder results in error compiled in Eclipse导入 sun.misc.BASE64Encoder 导致在 Eclipse 中编译错误
【发布时间】:2011-04-05 08:58:09
【问题描述】:

对于这两个导入;

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

我该如何解决这个错误?

【问题讨论】:

    标签: java eclipse


    【解决方案1】:

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

    【讨论】:

    • 这些天尝试使用 sun.misc.Signal 时也会出现同样的问题。回答实际问题也解决了我的问题。
    • 它可能已经“回答了问题”,但将错误作为警告掩盖是一个糟糕的解决方案(虽然还不够糟糕,无法投票)。 @Orism's answer below using javax.xml.bind.DatatypeConverter 解决了问题 没有额外的依赖,其中 JDK >= 1.6
    • @earcam 这只是一个错误,因为 Eclipse 默认配置过于热情。 Java 编译器不认为这是错误,NetBeans 也不认为。
    • @EJP 同意 - 错误是致命的,这当然不应该,但根据 Jon Skeet 的回答 - 这是对运行时可移植性的有效且严重的警告。无论如何认为这在很大程度上是历史性的(2011==Indigo),在 Kepler 中默认是警告(不确定从哪个版本开始)。
    【解决方案2】:

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

    【讨论】:

    • @downvoter 请解释一下,除非您希望您的反对票仅被视为网站破坏行为。
    • 我猜它被否决了支持 nIKUNJ 或 Jon Skeeter 的答案。
    • @VladimirZhilyaev 这不是投票系统的用途。明确表示“这个答案没有用”。如果有更好的答案,当然应该投赞成票,但应该对不正确或不相关的答案投反对票。很明显,有些人有其他议程。
    • 另请注意,此特定导入仅适用于 Oracle JVM。其他供应商很可能没有此类导致您的程序中断。
    • 投反对票没有正当理由。 @EJP 说明了原因:“由您的 Eclipse 配置引起。”,解决方案 1:“您可以将其减少为警告”,解决方案 2:“使用 Apache Commons” ....停止随机投票,这很糟糕。
    【解决方案3】:

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

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

    【讨论】:

    • 由于 oracle 在接管 Sun 时希望一切都成为 oracle 品牌,这将是重新包装一切并一劳永逸地摆脱此类的绝佳机会!
    • @ThorbjørnRavnAndersen 他们做得更好;他们added a Base64 class into java.util.
    【解决方案4】:

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

    parseBase64Binary() / printBase64Binary()

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

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

    【讨论】:

    • 就我个人而言,我不太喜欢那个 API,我不会使用 XML 相关类中的 base 64(它将您的代码绑定到可能不需要的 XML 组件)。但是Oracle最终决定实现base 64 in the Util package in Java 8,所以不再需要了。
    【解决方案5】:

    是的,sun.misc.BASE64Decoder 慢得多:比 java.xml.bind.DatatypeConverter.parseBase64Binary() 慢 9 倍,比 org.apache.commons.codec.binary.Base64.decodeBase64() 慢 4 倍,在至少对于 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);
            }
        }
    }
    

    【讨论】:

    • 这样记录速度声明的来源会很有用。
    • 我认为你的意思是 javax.xml.bind.DatatypeConverter;如果我错了,请纠正我,但是看到你给出这个答案而不是评论,我怀疑你会这样做。
    • 当然,添加了 avgvstvs、测试程序和环境详细信息。
    • 感谢您执行此分析,但它确实无法回答问题。您可以考虑创建一个单独的自我回答问题。
    • fwiw 我用 java 8 重新运行了这个测试,新标准 java.util.Base64.getDecoder().decode("b64") 现在比之前的赢家 javax.xml 快一点。 bind.DatatypeConverter.
    【解决方案6】:

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

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

    将单选按钮从 Execution environment 切换到 Alernate JRE。 这选择了相同的 jdk1.6.0_37,但是在 clean/build 之后编译错误消失了。

    ram(3 月 16 日 9:00)的回答可能与此有关。

    【讨论】:

    • 这是可行的,因为执行环境仅公开 Java 标准 API,而选择 JDK 公开所有公共类,包括那些您不应该使用的类。
    【解决方案7】:

    此错误是因为您正在导入以下两个类 导入 sun.misc.BASE64Encoder;导入 sun.misc.BASE64Decoder;。也许您正在使用该库的编码和解码,如下所示。

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

    是的,你可以导入 sun.misc.BASE64Encoder java.util.Base64class.现在把之前的encode方法改成如下:

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

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

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

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

    【讨论】:

      【解决方案8】:
      1. 转到项目属性中的构建路径设置。
      2. 删除 JRE 系统库
      3. 添加回来;选择“添加库”并选择 JRE 系统库。默认值对我有用。

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

      【讨论】:

        【解决方案9】:

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

        【讨论】:

        • 这可能是个问题.. 因为我需要使用 BASE64Decoder(支持 java 6 或 7),当客户端升级到更新版本的 JAVA 时,它会破坏代码......
        【解决方案10】:

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

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


        Java 从 Java 1.8 开始在标准 API 中包含 Base64 class。请参阅下面的示例,了解如何使用它:

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


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

        使用内部类可能会破坏与未来 Java SE 运行时的兼容性;这些类的实现和位置可以随时更改。强烈建议不要禁用错误或警告(但在之前的答案中建议禁用错误,包括投票最多的两个)。

        【讨论】:

          【解决方案11】:

          我使用的是unix系统。

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

          【讨论】:

            【解决方案12】:

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

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

            【讨论】:

              【解决方案13】:

              解决方案:进入 java 8 sdk fodler,从 jre\lib\rt.jar 复制到 sdklib.jar(它在 eclipse 文件夹的某处)类(具有相同的路径):

              sun/misc/BASE64Decoder.class,
              sun/misc/BASE64Encoder.class,
              sun/misc/CharacterDecoder.class,
              sun/misc/CharacterEncoder.class

              就是这样

              【讨论】:

                【解决方案14】:

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

                import Decoder.BASE64Decoder;
                import Decoder.BASE64Encoder;
                

                【讨论】:

                  猜你喜欢
                  • 2015-11-18
                  • 2020-07-05
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-06-29
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-02-01
                  • 2015-09-12
                  相关资源
                  最近更新 更多