import sun.misc.BASE64Encoder приводит к ошибке, скомпилированной в Eclipse - PullRequest
60 голосов
/ 05 апреля 2011

Для этих двух импортов;

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

Как я могу устранить эту ошибку?

Ответы [ 12 ]

123 голосов
/ 05 апреля 2011

Перейти в Окно -> Настройки -> Java -> Компилятор -> Ошибка / Предупреждения.
Выберите Устаревший и ограниченный API . Измените его на предупреждение.
Изменить запрещено и Обескуражено Ссылка и изменить его на предупреждение. (или как вам нужно.)

60 голосов
/ 05 апреля 2011

Эта ошибка вызвана вашей конфигурацией Eclipse. Вы можете уменьшить это до предупреждения. Еще лучше , используйте кодировщик Base64, который не является частью закрытого API. Apache Commons имеет один , или, если вы уже используете Java 1.8, используйте java.util.Base64.

34 голосов
/ 05 апреля 2011

Конечно - просто не используйте кодировщик / декодер Sun base64. Существует множество других доступных опций, включая Кодек Apache или эту реализацию общественного достояния .

Тогда прочитайте , почему вы не должны использовать sun. * Packages .

24 голосов
/ 23 августа 2012

Java 6 поставляет javax.xml.bind.DatatypeConverter. Этот класс предоставляет два статических метода, которые поддерживают одинаковое декодирование и кодирование:

parseBase64Binary() / printBase64Binary()

Обновление: Начиная с Java 8 у нас теперь намного лучшая поддержка Base64 .

Используйте это, и вам не понадобится дополнительная библиотека, как Apache Commons Codec.

5 голосов
/ 26 июля 2013

У меня была эта проблема на jdk1.6.0_37.Это единственный JDE / JRE в моей системе.Я не знаю почему, но следующее решило проблему:

Проект -> Свойства -> Путь сборки Java -> Библиотеки

Переключение переключателя из Среда выполнения до Alernate JRE .При этом выбирается тот же jdk1.6.0_37, но после очистки / сборки ошибка компиляции исчезла.

Возможно, уточнение в ответ от ram (16 марта в 9:00)сделай что-нибудь с этим.

5 голосов
/ 24 августа 2012

Да, и 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);
        }
    }
}
3 голосов
/ 20 февраля 2015

Эта ошибка (или предупреждение в более поздних версиях) возникает из-за компиляции в среде выполнения 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 или Guava .


Не следует использовать внутренние классы Sun . Эти классы используются для реализации Java. У них есть публичные методы, позволяющие создавать экземпляры из других пакетов. Однако хорошая среда сборки должна защитить вас от их использования.

Использование внутренних классов может нарушить совместимость с будущими средами выполнения Java SE; реализация и расположение этих классов могут измениться в любое время. Настоятельно не рекомендуется отключать ошибку или предупреждение.

2 голосов
/ 16 марта 2013
  1. Перейти в настройки пути сборки в свойствах проекта.
  2. Удалить системную библиотеку JRE
  3. Добавить обратно; Выберите «Добавить библиотеку» и выберите Системную библиотеку JRE. По умолчанию у меня сработало.

Это работает, потому что у вас есть несколько классов в разных файлах jar. Удаление и повторное добавление jre lib сделает правильные классы первыми. Если вы хотите фундаментальное решение, убедитесь, что вы исключаете файлы JAR с теми же классами.

1 голос
/ 20 января 2014

Я использую систему Unix.

В eclipse project-> Properties -> Java Compiler -> Errors / Warning -> Forbidden Access (правило доступа) -> Превратить его в предупреждение / Ignore (ранее было установлено значение Error).

0 голосов
/ 25 октября 2017

Добавьте base64decoder jar и попробуйте следующий импорт:

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...