2011-04-05 240 views
57

對於這兩個導入;導入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 

我怎樣才能解決這個問題?

回答

55

該錯誤是由您的Eclipse配置引起的。您可以將其降低爲警告。 Better still,請使用不屬於非公開API的Base64編碼器。 Apache Commons有one,或者當您已經使用Java 1.8時,則使用java.util.Base64

+1

是的,在這裏找到它:http://commons.apache.org/codec/ – jyz 2012-04-12 17:46:05

+2

@downvoter請解釋,除非你想你downvote被視爲純粹的網站破壞。 – EJP 2012-11-09 04:02:21

+0

我想這是downvoted贊成nikunj或Jon Skeeter的答案。 – 2013-01-25 09:54:51

33

當然 - 只是不要使用Sun的base64編碼器/解碼器。有很多其他選項可用,包括Apache Codec或此public domain implementation

然後閱讀why you shouldn't use sun.* packages

+1

由於Oracle想要的一切接管太陽時要甲骨文品牌,這將是重新包裝的一切,得到一勞永逸地擺脫這個類的一個絕佳機會所有! – 2014-03-12 16:10:10

+0

@ThorbjørnRavnAndersen他們做得更好;他們[將一個Base64類添加到'java.util'](http://stackoverflow.com/a/28628476/589259)。 – 2015-02-20 12:11:27

121

轉到窗口 - >首選項 - > Java - >編譯器 - >錯誤/警告。
選擇已棄用和受限制的API。將其更改爲警告。
更改禁止不鼓勵引用並將其更改爲警告。 (或根據您的需要)。

+9

+1因爲他回答了這個問題 – FelixM 2011-06-13 13:52:02

+0

同樣的問題occ這些日子,當嘗試使用sun.misc.Signal時也是如此。回答實際問題也解決了我的問題。 – AndrewPK 2012-04-04 15:22:48

+2

它可能已經「回答了問題」,但掩蓋了一個錯誤,因爲警告是一個糟糕的解決方案(雖然不夠糟糕)。 [@Orism](http://stackoverflow.com/a/12090601/573057)下面的回答使用'javax.xml.bind.DatatypeConverter' **解決了問題**,沒有額外的依賴,其中JDK> = 1.6 – earcam 2013-06-13 04:32:30

24

Java 6將運送javax.xml.bind.DatatypeConverter。這個類提供了支持相同的解碼&編碼兩個靜態方法:

parseBase64Binary()/printBase64Binary()

更新: 由於Java 8,我們現在有一個更好的Base64支持。

使用這個,你將不需要額外的庫,如Apache Commons Codec

+0

不錯的提示!謝謝。 – marcolopes 2013-02-23 07:04:06

+1

我個人並不喜歡那個API,也不會使用XML相關類中的base 64(它將您的代碼綁定到一個可能不需要的XML組件上)。但是Oracle最終決定在[Java 8的Util包中]實現base 64(http://stackoverflow.com/a/28628476/589259),因此不再需要它了。 – 2015-02-20 12:03:42

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 

順便說一句,這與公共編解碼器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); 
     } 
    } 
} 
+0

這樣記錄速度聲明的來源將是有用的。 – avgvstvs 2012-09-20 12:52:45

+0

我想你的意思是javax.xml.bind.DatatypeConverter;請糾正我,如果我錯了,但看到你給這個答案,而不是評論,我懷疑你會。 – RyanfaeScotland 2013-03-11 14:31:25

+0

謝謝瑞恩,現在改正了。 – jamshid 2013-03-12 15:07:53

2
  1. 轉到項目屬性構建路徑設置。
  2. 刪除JRE系統庫
  3. 將其添加回去;選擇「添加庫」並選擇JRE系統庫。默認爲我工作。

這是有效的,因爲你在不同的jar文件中有多個類。刪除並重新添加jre lib將使正確的類成爲第一個。如果你想要一個基本的解決方案,請確保你排除了具有相同類的jar文件。

5

我在jdk1.6.0_37上有這個問題。 這是我係統上唯一的JDE/JRE。我不知道爲什麼,但下面解決了這個問題:從RAM

Project -> Properties -> Java Build Path - > Libraries

Switch radio button from Execution environment to Alernate JRE. This selects the same jdk1.6.0_37, but after clean/build the compile error disappeared.

也許澄清答案(3月16日上午9時)必須做的東西。

+0

這是有效的,因爲執行環境只公開Java標準API,而選擇JDK會公開所有公共類,包括*你不應該使用*。 – 2015-02-20 13:08:59

1

我正在使用unix系統。在Eclipse項目 - >屬性 - > Java編譯器 - >錯誤/警告 - >禁止訪問(訪問規則) - >將其變爲警告/忽略(以前它被設置爲錯誤)。

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自從Java 1.8以來,在標準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運行時的兼容性;這些類的實現和位置可以隨時更改。應該強烈建議禁用錯誤或警告。

0

我知道這是很老的帖子。由於我們在maven 中沒有任何sun.misc,我們可以很容易地使用

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

0

此錯誤是因爲您正在導入兩類以下 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); 

現在一切都完成了,您可以保存您的程序並運行。它將運行而不顯示任何錯誤。

0

添加base64decoder罐子和嘗試這些進口:

import Decoder.BASE64Decoder; 
import Decoder.BASE64Encoder;