импорт солнца.разное.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 FilesJavajre6librt.jar

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

12 59

12 ответов:

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

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

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

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

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

parseBase64Binary() / printBase64Binary()

обновление: С Java 8 мы теперь имеем гораздо лучше Base64 поддержка.

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

Ага, и солнце.разное.BASE64Decoder намного медленнее: 9x медленнее, чем java.XML.связывать.Datatypeconverter, который.parseBase64Binary () и в 4 раза медленнее, чем org.апаш.палата общин.кодек.двоичный.В 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

кстати, это с 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);
        }
    }
}

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

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

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

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

эта ошибка (или предупреждение в более поздних версиях) возникает из-за компиляции в среде выполнения Java. Это отображается как JRE System library [CDC-1.0/Foundation-1.0] путь построения Java-проект в Eclipse. Такие среды предоставляют только стандартный 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 или гуавы должен быть использован.


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

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

  1. перейдите к настройкам пути сборки в свойствах проекта.
  2. удалить системную библиотеку JRE
  3. добавить его обратно; выберите "Добавить библиотеку" и выберите системную библиотеку JRE. По умолчанию сработало для меня.

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

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

в проекте eclipse - > свойства - > компилятор Java - > ошибки/предупреждение - > запрещенный доступ(правило доступа) - > включите его в warning/Ignore(ранее он был установлен в Error).

Я знаю, что это очень старый пост. Так как мы не имеем какую-либо вещь на солнце.смешанная в Maven мы можем легко использовать

StringUtils.newStringUtf8 (Base64.encodeBase64(encVal)); Из орг.апаш.палата общин.кодек.двоичный.В base64

эта ошибка вызвана тем, что вы импортируете ниже двух классов импорт солнца.разное.BASE64Encoder; импорт ВС.разное.BASE64Decoder;.Maybe you are using encode and decode of that library like below.

new BASE64Encoder().encode(encVal);
newBASE64Decoder().decodeBuffer(encryptedData);

да, вместо солнца.разное.BASE64Encoder вы можете импортировать java.утиль.Класс Base64.Теперь измените предыдущий метод кодирования, как показано ниже

encryptedData=Base64.getEncoder().encodeToString(encryptedByteArray);

теперь измените предыдущий метод декодирования, как показано ниже

byte[] base64DecodedData = Base64.getDecoder().decode(base64EncodedData);

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

добавить base64decoder jar и попробовать эти импорта:

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;