Ограничение доступа к классу из-за ограничения на требуемую библиотеку rt.jar?

824

Я пытаюсь скомпилировать код Java 1.4, который был создан WSDL2Java IBM на Java5, без воссоздания заглушек и увидел эту ошибку в Eclipse . Я предполагаю, что сгенерированные заглушки должны просто компилироваться, пока есть среда выполнения (они есть).
jars

Access restriction: The type QName is not accessible due to restriction on required library C:\Program Files\Java\jdk1.5.0_16\jre\lib\rt.jar

Полное имя класса javax.xml.namespace.QName

Что именно здесь происходит? Это тот случай, когда я пытаюсь переработать свинью из колбасы? Мне лучше воссоздать заглушки?

Сэл
источник
1
Я не понимаю, почему вы не просто скомпилируете это где-то еще и запустите его в вашей целевой (так я думаю) среде 1.4?
Тим Бюте
Конечной целевой средой является jboss4.2 на jdk5.
Sal
2
О статусе «защищен»: в StackOverflow ничего не сказано «Спасибо» или «Я тоже» в качестве отклика;)
OscarRyz
6
См. Большой голос с наибольшим количеством ответов ... Игнорируйте 96% остальной части этой страницы. Поиск: "Нелс Бекман", 1 фев '10 в 4:09
будет
1
Для меня работало редактирование / изменение системной библиотеки JRE из среды выполнения (или по умолчанию рабочей области) в альтернативную JRE (я выбрал ту же версию Java). Вы также должны обеспечить (1) правильный порядок на вкладке « Порядок и экспорт », (2) правильный уровень соответствия в настройках компилятора Java (аналогично выбранной версии Java).
ADTC

Ответы:

1884

Есть еще одно решение, которое также работает.

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

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

Для меня есть: javax.xml.soap.SOAPPartв трех различных банках: axis-saaj-1.4.jar, saaj-api-1.3.jarиrt.jar

Нельс Бекман
источник
1
Это ошибка Eclipse или мы случайно обходим ограничение (и нарушаем условия лицензии)? Если это ошибка Eclipse, то есть ли ошибка?
Что такое
@ Доктор Я никогда не использовал это для любого кода, который был особенно важен, поэтому я не стал больше заниматься расследованием ... Если вы что-нибудь узнаете, сообщите нам.
Нельс Бекман,
3
@ URL87 Если щелкнуть правой кнопкой мыши папку проекта, перейдите в «Путь сборки ...», «Настроить путь сборки», «Библиотеки» (вкладка), вы должны увидеть «Добавить библиотеку» в качестве одной из кнопок справа .. Это также сработало для меня, отличный ответ
Алексей Блю,
8
Лучшее решение в последних версиях Eclipse - это не удалить Системную библиотеку JRE, а перейти на вкладку «Заказ и экспорт» и просто переместить Системную библиотеку JRE в нижнюю часть (что фактически делает удаление и добавление, но вы не не нужно удалять и добавлять, чтобы сделать это).
user1676075
1
Это 2018 год и версия затмения 5.0. Эта ошибка / проблема все еще существует. Большое спасибо @NelsBeckman. Ваш ответ помог мне после 3/4 десятилетия с момента его публикации.
Аравамудхан
120

http://www.digizol.com/2008/09/eclipse-access-restriction-on-library.html работал лучше всего для меня.

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

В Mac OS X / Linux: Eclipse -> Настройки -> Java -> Компилятор -> Ошибки / предупреждения -> Устаревший и ограниченный API -> Запрещенная ссылка (правила доступа): -> изменить на предупреждение

scommab
источник
62
Это может сработать, но это не правильное решение. Вы должны понять, почему ограничения доступа существовали в первую очередь. Это также скрывает все будущие случаи этого, что может быть более важным!
Адриан Муат
1
@AdrianMouat, это в значительной степени не имеет значения. Если я хочу, чтобы это ушло, я хочу, чтобы оно ушло. Но, конечно же, никто не должен кодировать против непубличных API, нет.
stolsvik
3
@stolsvik - ты потерял меня; Вы говорите, что причина, по которой проблема существует, не имеет значения?
Адриан Муат
1
У меня есть эта проблема на одном методе. Я представляю себе использование альтернативного JDK (например, OpenJDK - лучший вариант). Это сказало, с одной стороны, это может быть круто однажды. НЕ в производственном коде. Не для продолжающегося дизайнерского усилия. Я не могу сказать вам, сколько человеко-дней теряется на такого рода хакерских атаках.
будет
5
@AdrianMouat - имеет смысл. Я бы не хотел делать что-то подобное в ядерном реакторе - слишком много тепла в диспетчерской? Итак, отключите все предупреждения. Сделайте большие заголовки на следующий день. : P
Дэвид Блейн
67

Я встретил ту же проблему. Я нашел ответ на сайте: http://www.17ext.com .
Сначала удалите системные библиотеки JRE. Затем снова импортируйте системные библиотеки JRE.

Я не знаю почему. Как бы то ни было, это решило мою проблему, надеюсь, это поможет вам.

sanwanxian
источник
10
Да, видимо, вы ответили на этот вопрос так же, как и я, несколько месяцев назад. Не уверен, почему я не увидел ваш ответ тогда ...
Нельс Бекман
34

Я предполагаю, что вы пытаетесь заменить стандартный класс, который поставляется с Java 5, одним классом в вашей библиотеке.

Это не разрешено в соответствии с условиями лицензионного соглашения, однако AFAIK не применялся до Java 5.

Я видел это с QName раньше, и я «исправил» это, удалив класс из банки, которую я имел.

РЕДАКТИРОВАТЬ http://www.manpagez.com/man/1/java/ примечания для опции "-Xbootclasspath:"

«Приложения, которые используют эту опцию с целью переопределения класса в rt.jar, не должны развертываться, поскольку это противоречило бы лицензии двоичного кода Java 2 Runtime Environment».

http://www.idt.mdh.se/rc/sumo/aJile/Uppackat/jre/LICENSE

«Ограничения технологии Java. Вы не можете изменять интерфейс платформы Java (« JPI », определенный как классы, содержащиеся в пакете« java »или любых подпакетах пакета« java »), создавая дополнительные классы в JPI или вызывая иным образом добавление или изменение классов в JPI. В случае, если вы создаете дополнительный класс и связанные API (-ы), который (i) расширяет функциональность платформы Java, и (ii) предоставляется сторонним разработчикам программного обеспечения для В целях разработки дополнительного программного обеспечения, которое вызывает такой дополнительный API, вы должны незамедлительно опубликовать точную спецификацию такого API для свободного использования всеми разработчиками. Вы не можете создавать или разрешать своим лицензиатам создавать дополнительные классы, интерфейсы,или подпакеты, которые в любом случае обозначены как «java», «javax», «sun» или аналогичные соглашения, как указано в Sun в любом обозначении соглашения об именовании. "

Питер Лори
источник
2
это оно. в одном из jar-файлов пути был класс QName. найти . -name "* .jar" -print -exec unzip -t {} \; | grep "QName" нашел его.
Сал
1
Не могли бы вы дать ссылку о том, что нельзя заменять классы, поставляемые с Java? Все, что я нашел в лицензионном соглашении, это ограничения, связанные с распространением самой Java, а не программ на Java, но я не очень долго искал.
Адриан Муат
25

Я тоже получаю эту ошибку, но мой проект построен из командной строки с использованием Maven и компилятора tycho (это набор плагинов OSGi). После массового разбора людей, имеющих ту же проблему, но исправляющих ее в Eclipse, а не в командной строке, я нашел сообщение на форуме разработчиков Tycho, в котором отвечал на мой вопрос, используя конфигурацию, pom.xmlчтобы игнорировать предупреждение компилятора об ограничении доступа:

<plugin>
    <groupId>org.eclipse.tycho</groupId>
    <artifactId>tycho-compiler-plugin</artifactId>
    <version>${tycho.version}</version>
    <configuration>
        <compilerArgument>-warn:+discouraged,forbidden</compilerArgument>
    </configuration>
</plugin>

Более подробную информацию можно найти в FAQ Tycho . Это заняло у меня ВОЗРАСТ для разработки, поэтому я решил, что помогу кому-нибудь другому, пытающемуся исправить эти ошибки ограничения доступа из командной строки, разместив этот ответ.

Dawngerpony
источник
13
  • Зайдите в настройки Build Path в свойствах проекта. Windows -> Preferences -> Java Compiler
  • Удалить системную библиотеку JRE
  • Добавьте еще одну JRE с "идеальным соответствием"
  • очистите и постройте свой проект снова. Это сработало для меня.
Mayur
источник
13

У меня тоже была эта проблема. Очевидно, я установил JRE на 1,5 вместо 1,6 в моем пути сборки.

Dorus
источник
1
Та же проблема здесь. В моем случае используется Maven, который по умолчанию равен 1,5, если не указан.
Грег Хаскинс
Не забудьте поместить это в свой POM, чтобы он не изменился после обновления. <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> </ properties>
Филип Рего
8

В дополнение к решению Нельс Бекман , у меня есть следующие советы:

Под Configure Build Path я должен был изменить порядок своих записей в Order and Export .

Кроме того, как разработчик Eclipse PDE, мне нужно было изменить порядок моих зависимостей в моем MANIFEST.MF, добавив проблемный пакет первым в списке.

Играя с этими циферблатами, а также запустив Project> Clean между ними, я смог устранить эти предупреждения.

modulitos
источник
8

для меня вот как я это решаю

  • перейти к пути сборки текущего проекта

под библиотеками

  • выберите « Системная библиотека JRE [jdk1.8xxx]»
  • нажмите изменить
  • и выберите «JRE рабочей области по умолчанию (jdk1.8xx)» ИЛИ альтернативный JRE
  • Нажмите готово
  • Нажмите ОК

введите описание изображения здесь

Примечание: убедитесь, что в Eclipse / Preferences (НЕ проект) / Java / Installed JRE, что JDK указывает на папку JDK, а не JRE C: \ Program Files \ Java \ jdk1.8.0_74

введите описание изображения здесь

usertest
источник
Мой был уже установлен на 1,7 ... 79, поэтому я был в панике. Но я просто выбрал его снова, нажал «Применить», и ошибка исчезла. Уф.
Марво
Ух ты. Это помогло и здесь - переход от «среды выполнения» к «альтернативной JRE». Если у кого-либо есть логическое объяснение этому .. (здесь это произошло после изменения Java-проекта-сборщика с 1.5 (5.0 в файле конфигурации .settings) на 1.8. Переход от ошибки к предупреждению в глобальных префиксах (см. Другой ответ) не произошел help: все еще ошибки. Это о старых классах солнца, которые мы используем из пакета com.sun.image.codec. *)
hyphan
6

Извините за обновление старого POST. Я получил сообщение о проблеме и решил ее, как указано ниже.

Предполагая, что вы используете плагин Eclipse + m2e maven, если вы получаете эту ошибку ограничения доступа, щелкните правой кнопкой мыши проект / модуль, в котором у вас есть ошибка -> Свойства -> Путь сборки -> Библиотека -> Заменить JDK / JRE к тому, который используется в рабочей области Eclipse.

Я выполнил вышеуказанные шаги, и проблема решена.

Арун Б Чандрасекаран
источник
Справедливо, но вы в основном воспроизвели формулировку принятого ответа Нельс Бекман.
Стивен Вулф
5

В случае, если вы уверены, что должны иметь доступ к данному классу, это может означать, что вы добавили в свой проект несколько jar-файлов, содержащих классы с одинаковыми именами (или путями), но разным содержимым, и они затмевают друг друга (как правило, старые пользовательские настройки). build jar содержит встроенную старую версию сторонней библиотеки).

Например, когда вы добавляете jar, реализующий:

a.b.c.d1
a.b.c.d2

но также и более старая версия, реализующая только:

a.b.c.d1
(d2 is missing altogether or has restricted access)

В редакторе кода все работает нормально, но во время компиляции происходит сбой, если «старая» библиотека затмевает новую - d2 внезапно оказывается «отсутствующей или недоступной», даже если она там есть.

Решение состоит в том, чтобы проверить порядок библиотек времени компиляции и убедиться, что библиотека с правильной реализацией идет первой.

Мистер напик
источник
4

Перейдите к пути сборки Java в свойствах проекта. Удалите существующую системную библиотеку JRE, затем добавьте ее снова, например, Add Library -> JRE Lib - выберите jre ---> Finish. Наконец, выберите заказ и вкладку экспорта, выберите JRE Lib и двигайтесь вверх. Вот и все.

Виджай Бхатт
источник
3

Просто измените порядок пути к библиотекам вашего проекта. Щелкните правой кнопкой мыши проект> Путь сборки> Настроить путь сборки> Выбрать порядок и экспорт (вкладка)> Изменить порядок записей. Я надеюсь, что перемещение "JRE System Library" внизу будет работать. Это сработало для меня. Легко и просто .... !!!

Самита Чатуранга
источник
3

В моем случае было несоответствие между путем сборки JRE и установленным JRE в среде выполнения. Я перешел в Project> Properties> Java compiler. Внизу было предупреждающее сообщение.

Я нажал на ссылки «Установленный JRE», «Среда выполнения», «Путь сборки Java» и изменил версию JDK на 1.7, и предупреждение исчезло.

Soumyajit Swain
источник
0

Добавление правильной системы JRE через путь сборки - решение, но ваше затмение все еще может иметь ошибку. Чтобы решить эту проблему, перейдите в Java Build path -> Order and Export и переместите вашу системную библиотеку JRE вверху. Это решило мою проблему.

Абхишек Сони
источник