it-swarm.com.ru

импорт 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

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

59
karikari

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

57
user207421

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

121
nIKUNJ

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

Затем прочитайте почему вы не должны использовать пакеты Sun. * .

34
Jon Skeet

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

parseBase64Binary() / printBase64Binary()

Update: Начиная с Java 8 у нас теперь намного лучше Base64 Support.

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

24
StaticBR

Да, и 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);
        }
    }
}
5
jamshid

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

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

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

Возможно, разъяснение в ответе от ram (16 марта в 9:00) как-то связано с этим.

5
user2622016

Эта ошибка (или предупреждение в более поздних версиях) возникает из-за того, что вы выполняете компиляцию в среде выполнения 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; реализация и расположение этих классов могут измениться в любое время. Настоятельно не рекомендуется отключать ошибку или предупреждение.

3
Maarten Bodewes
  1. Зайдите в настройки Build Path в свойствах проекта.
  2. Удалить системную библиотеку JRE
  3. Добавьте это назад; Выберите «Добавить библиотеку» и выберите Системную библиотеку JRE. По умолчанию работал для меня.

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

2
ram

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

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

1
NehPraka

Эта ошибка из-за того, что вы импортируете ниже двух классов 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
PyDevSRS

Я знаю, что это очень старый пост. Поскольку у нас нет ничего от Sun.misc в Maven Мы можем легко использовать 

StringUtils.newStringUtf8 (Base64.encodeBase64 (encVal)); От org.Apache.commons.codec.binary.Base64

0
Mohsin Khan

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

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;
0
Rajesh Kumar Gupta