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
Как я могу устранить эту ошибку?
15 ответов
Эта ошибка вызвана вашей конфигурацией Eclipse. Вы можете уменьшить его до предупреждения. Более того, используйте кодировщик Base64, который не является частью закрытого API. У Apache Commons есть один, или когда вы уже на Java 1.8, тогда используйте java.util.Base64
,
Перейдите в Окно -> Настройки ->Java-> Компилятор -> Ошибка / Предупреждения.
Выберите Устаревший и Ограниченный API. Измените это на предупреждение.
Измените Запрещенную и Обескураженную Ссылку и измените ее на предупреждение. (или как ваша потребность.)
Конечно, просто не используйте кодировщик / декодер Sun base64. Есть много других доступных опций, в том числе Apache Codec или эта общественная реализация.
Тогда прочитайте, почему вы не должны использовать пакеты sun.*.
Java 6 поставляет javax.xml.bind.DatatypeConverter
, Этот класс предоставляет два статических метода, которые поддерживают одинаковое декодирование и кодирование:
parseBase64Binary() / printBase64Binary()
Обновление: Начиная с Java 8 у нас теперь намного лучшая поддержка Base64.
Используйте это, и вам не понадобится дополнительная библиотека, как Apache Commons Codec
,
Эта ошибка из-за того, что вы импортируете ниже двух классов 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);
Теперь все готово, вы можете сохранить вашу программу и запустить. Он будет работать без каких-либо ошибок.
У меня была эта проблема на jdk1.6.0_37. Это единственный JDE/JRE в моей системе. Я не знаю почему, но следующее решило проблему:
Проект -> Свойства -> Путь сборки Java -> Библиотеки
Переключите переключатель из среды выполнения в Alernate JRE. При этом выбирается тот же jdk1.6.0_37, но после очистки / сборки ошибка компиляции исчезла.
Возможно, разъяснение в ответе от барана (16 марта в 9:00) как-то связано с этим.
Да, и sun.misc.BASE64Decoder работает намного медленнее: в 9 раз медленнее, чем java.xml.bind.DatatypeConverter.parseBase64Binary(), и в 4 раза медленнее, чем org.apache.commons.codec.binary.Base64.decodeBase64(), по крайней мере, для небольшая строка на Java 6 OSX.
Ниже приведена тестовая программа, которую я использовал. С Java 1.6.0_43 на OSX:
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);
}
}
}
Эта ошибка (или предупреждение в более поздних версиях) возникает из-за того, что вы выполняете компиляцию в среде выполнения Java. Это проявляется как JRE System library [CDC-1.0/Foundation-1.0]
в пути сборки вашего проекта Eclipse Java. Такие среды предоставляют только стандартный API-интерфейс Java вместо всех классов в среде выполнения. Это означает, что классы, используемые для реализации стандартного API Java, не предоставляются.
Вы можете разрешить доступ к этим конкретным классам, используя правила доступа, вы можете настроить Eclipse для непосредственного использования JDK или отключить ошибку. Однако вы бы скрывали серьезную ошибку, поскольку не следует использовать внутренние классы Sun (краткое пояснение приведено ниже).
Java содержит Base64
класс в стандартном API начиная с Java 1.8. Ниже приведен пример, как его использовать:
Оператор импорта 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.
Внутренние классы Sun не должны использоваться. Эти классы используются для реализации Java. У них есть публичные методы, позволяющие создавать экземпляры из других пакетов. Однако хорошая среда сборки должна защищать вас от их использования.
Использование внутренних классов может нарушить совместимость с будущими средами выполнения Java SE; реализация и расположение этих классов могут измениться в любое время. Настоятельно не рекомендуется отключать ошибку или предупреждение.
- Зайдите в настройки Build Path в свойствах проекта.
- Удалить системную библиотеку JRE
- Добавьте это назад; Выберите "Добавить библиотеку" и выберите Системную библиотеку JRE. По умолчанию работал для меня.
Это работает, потому что у вас есть несколько классов в разных файлах JAR. Удаление и повторное добавление jre lib сделает правильные классы первыми. Если вы хотите фундаментальное решение, убедитесь, что вы исключаете файлы JAR с теми же классами.
Получал сообщение «sun.misc.base64encoder не может быть разрешен к типу» в eclipse -
Решил эту проблему, указав eclipse на использование Java версии 1.8, установленной в системе - Windows -> Настройки -> Java -> Установленные JREs -> добавить путь jre (например: C:\Program Files\Java\jdk1.8.0_271)
Щелкните правой кнопкой мыши проект -> Maven -> Обновить проект.
Тогда это разрешится.
Я использую систему Unix.
В eclipse project-> Properties -> Java Compiler -> Errors/Warning -> Forbidden Access(правило доступа) -> превратить его в предупреждение /Ignore(ранее было установлено значение Error).
решение: зайдите в 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
это все
Я знаю, что это очень старый пост. Поскольку у нас нет ничего от Sun.misc в Maven, мы можем легко использовать
StringUtils.newStringUtf8(Base64.encodeBase64(encVal)); Из org.apache.commons.codec.binary.Base64
Добавьте base64decoder jar и попробуйте следующий импорт:
import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;