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

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

62
задан 20 February 2015 в 15:50

12 ответов

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

61
ответ дан 31 October 2019 в 13:03

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

123
ответ дан 31 October 2019 в 13:03

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

Затем читает , почему Вы не должны использовать солнце.* пакеты .

34
ответ дан 31 October 2019 в 13:03

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

parseBase64Binary() / printBase64Binary()

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

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

24
ответ дан 31 October 2019 в 13:03

Да, и sun.misc. BASE64Decoder является путем медленнее: 9x медленнее, чем 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 это с кодеком свободного городского населения 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
ответ дан 31 October 2019 в 13:03

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

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

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

, Возможно, разъяснение в ответе от поршень (16 марта в 9:00) должен сделать что-то с этим.

5
ответ дан 31 October 2019 в 13:03
  1. Переходят к настройкам Build Path в свойствах проекта.
  2. Удаляют Системную библиотеку JRE
  3. , Добавляет она назад; Выберите, "Добавьте Библиотека" и выберите Системную библиотеку JRE. Значение по умолчанию работало на меня.

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

2
ответ дан 31 October 2019 в 13:03

Эта ошибка (или предупреждение в более поздних версиях) происходит, потому что Вы компилируете против Среды выполнения Java. Это обнаруживается как JRE System library [CDC-1.0/Foundation-1.0] в пути Сборки Вашего проекта Java Eclipse. Такие среды только выставляют стандарт Java API вместо всех классов во времени выполнения. Это означает, что классы, привыкшие к реализация стандарт Java API, не выставляются.

можно предоставить доступ к этим конкретным классам с помощью правил доступа, Вы могли настроить 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 Кодек палаты общин или , Гуава должна использоваться.

<час>

Sun внутренние классы не должны использоваться . Те классы привыкли к [1 110] реализация Java. У них есть открытые методы позволить инстанцирование от других пакетов. Хорошая среда сборки однако должна защищать Вас от использования их.

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

2
ответ дан 31 October 2019 в 13:03

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

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

1
ответ дан 31 October 2019 в 13:03

Я знаю, что это - очень Старое сообщение. Так как у нас нет вещи sun.misc в знатоке, мы можем легко использовать

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

0
ответ дан 31 October 2019 в 13:03

Эта ошибка из-за Вас, импортируют ниже двух 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);

Теперь, все сделано, можно сохранить программу и работать. Это будет работать, не показывая ошибки.

0
ответ дан 31 October 2019 в 13:03

Добавьте base64decoder банку и попробуйте этот импорт:

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;
-1
ответ дан 31 October 2019 в 13:03

Другие вопросы по тегам:

Похожие вопросы: