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
Как я могу решить эту ошибку?
Ответы
Ответ 1
Эта ошибка вызвана вашей конфигурацией Eclipse. Вы можете уменьшить это до предупреждения. Еще лучше, используйте кодировщик Base64, который не является частью закрытого API. В Apache Commons есть один или, если вы уже используете Java 1.8, используйте java.util.Base64
.
Ответ 2
Перейдите в окно → Настройки → Java → Компилятор → Ошибка/Предупреждения.
Выберите Устаревший и ограниченный API. Измените его на предупреждение.
Измените запрещенную и Отклоненную ссылку и измените ее на предупреждение. (или как ваша потребность.)
Ответ 3
Конечно, просто не используйте кодировщик/декодер Sun base64. Существует множество других доступных опций, в том числе Apache Codec или эта реализация общественного домена.
Затем прочитайте почему вы не должны использовать sun. * packages.
Ответ 4
Java 6 отправляет javax.xml.bind.DatatypeConverter
. Этот класс предоставляет два статических метода, поддерживающих одно и то же декодирование и кодирование:
parseBase64Binary() / printBase64Binary()
Update:
Начиная с Java 8 у нас теперь есть намного лучше Base64 Поддержка.
Используйте это, и вам не понадобится дополнительная библиотека, например Apache Commons Codec
.
Ответ 5
Yup и sun.misc.BASE64Decoder медленнее: в 9 раз медленнее, чем java.xml.bind.DatatypeConverter.parseBase64Binary() и 4x медленнее, чем 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
Btw, что с 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);
}
}
}
Ответ 6
У меня была эта проблема на jdk1.6.0_37.
Это единственная JDE/JRE в моей системе. Я не знаю почему, но следующее решение проблемы:
Проект → Свойства → Путь сборки Java → Библиотеки
Переключить переключатель из среды выполнения в Alernate JRE. Это выбирает тот же jdk1.6.0_37, но после очистки/сборки ошибка компиляции исчезла.
Возможно, разъяснение в ответ от барана (16 марта в 9:00) должно что-то с этим сделать.
Ответ 7
- Перейдите в настройки пути сборки в свойствах проекта.
- Удалить библиотеку JRE
- Добавьте его обратно; Выберите "Добавить библиотеку" и выберите Системную библиотеку JRE. По умолчанию работала для меня.
Это работает, потому что у вас есть несколько классов в разных файлах jar. Удаление и повторное добавление jre lib сделает первые классы первыми. Если вы хотите фундаментальное решение, убедитесь, что вы исключили файлы jar с теми же классами.
Ответ 8
Эта ошибка (или предупреждение в более поздних версиях) возникает из-за того, что вы компилируете среду Java Execution Environment. Это отображается как JRE System library [CDC-1.0/Foundation-1.0]
в пути сборки вашего проекта Java Eclipse. Такие среды выставляют только стандартный Java-API, а не все классы во время выполнения. Это означает, что классы, используемые для реализации стандартного 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 runtimes; реализация и расположение этих классов могут измениться в любое время. Это должно быть категорически запрещено отключать ошибку или предупреждение.
Ответ 9
Я использую систему unix.
В проекте eclipse- > Свойства → Компилятор Java → Ошибки/Предупреждение → Запрещенный доступ (правило доступа) → Поверните его на предупреждение/Игнорировать (ранее оно было установлено на Ошибка).
Ответ 10
Я знаю, что это очень старый пост. Поскольку у нас нет какой-либо вещи sun.misc in maven
мы можем легко использовать
StringUtils.newStringUtf8 (Base64.encodeBase64 (encVal));
Из org.apache.commons.codec.binary.Base64
Ответ 11
Эта ошибка из-за того, что вы импортируете ниже двух классов
import sun.misc.BASE64Encoder; импорт sun.misc.BASE64Decoder ;. Возможно, вы используете кодирование и декодирование этой библиотеки, как показано ниже.
new BASE64Encoder().encode(encVal);
newBASE64Decoder().decodeBuffer(encryptedData);
Да, вместо sun.misc.BASE64Encoder вы можете импортировать
Класс java.util.Base64
. Теперь измените предыдущий метод кодирования, как показано ниже:
encryptedData=Base64.getEncoder().encodeToString(encryptedByteArray);
Теперь измените предыдущий метод декодирования, как показано ниже
byte[] base64DecodedData = Base64.getDecoder().decode(base64EncodedData);
Теперь все готово, вы можете сохранить вашу программу и запустить. Он будет работать без каких-либо ошибок.
Ответ 12
Добавьте баночку base64decoder и попробуйте выполнить импорт:
import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;