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. Измените его на предупреждение.
Измените запрещенную и Отклоненную ссылку и измените ее на предупреждение. (или как ваша потребность.)

Ответ 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;