Обмеження доступу до класу через обмеження на потрібну бібліотеку rt.jar?


824

Я намагаюся скомпілювати код Java 1.4 , створений IBM WSDL2Java на 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.
сл

2
Про статус "захищеного": у StackOverflow нічого не сказано "Дякую" чи "мені теж" як оновлення;)
OscarRyz

6
Див. Великий «найвідповідальніший-відповідь» ... Ігноруй 96% решти цієї сторінки. Пошук: "Нельс Бекман", 1 лютого '10 о 4:09
буде

1
Для мене працювало редагування / зміна системної бібліотеки JRE з середовища виконання (або за замовчуванням робочої області) на альтернативне JRE (я вибрав ту саму версію Java). Ви також повинні забезпечити (1) правильний порядок на вкладці « Замовлення та експорт », (2) правильний рівень відповідності в налаштуваннях компілятора Java (такий же, як у вибраній версії Java).
ADTC

Відповіді:


1884

Є ще одне рішення, яке також працює.

  1. Перейдіть до налаштувань Шляху побудови у властивостях проекту.
  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, то чи подана помилка?
docwhat

@Doctor Я ніколи не використовував це для будь-якого коду, який був особливо важливим, тому я більше не досліджував ... Якщо ви щось знайдете, будь ласка, повідомте нас про це.
Нельс Бекман

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 -> Заборонена посилання (правила доступу): -> змінити на попередження


62
Це може спрацювати, але це не правильне рішення. Вам потрібно зрозуміти, чому в першу чергу існувало обмеження доступу. Він також приховає всі майбутні випадки цього, що може бути важливіше!
Адріан Муат

1
@AdrianMouat, це майже не має значення. Якщо я хочу, щоб він пішов, я хочу, щоб він пішов. Але, безумовно, не можна кодувати проти непублічних API, ні.
stolsvik

3
@stolsvik - ти мене загубив; Ви говорите, що причина, чому існує проблема, не має значення?
Адріан Муат

1
У мене ця проблема є одним методом. Я уявляю використання альтернативного JDK (на кшталт OpenJDK - кращий варіант). Це сказало для однієї речі, що "може бути здорово" один раз. НЕ у виробничому коді. Не для поточних дизайнерських зусиль. Я не можу вам сказати, скільки людино-днів загубляться на такому кр-хаку.
буде

5
@AdrianMouat - має сенс. Мені б не хотілося щось подібне робити в ядерному реакторі - Занадто багато тепла в контрольній? Отже, відключіть усі попередження. Зробіть великі заголовки наступного дня. : P
Дейвід Блейн

67

Я зустрів ту саму проблему. Я знайшов відповідь на веб-сайті: http://www.17ext.com .
Спочатку видаліть бібліотеки системи JRE. Потім знову імпортуйте бібліотеки системи JRE.

Не знаю, чому. Хоча це вирішило мою проблему, сподіваюся, вона може вам допомогти.


10
Так, ти, мабуть, ти відповів на це питання так само, як і я, кілька місяців тому. Не впевнений, чому я тоді не бачив вашої відповіді ...
Нельс Бекман

34

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

Це заборонено за умовами ліцензійної угоди, однак AFAIK не застосовувався до Java 5.

Я вже бачив це з QName і раніше, і я "виправив" його, видаливши клас з банки, яку я мав.

EDIT 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
Це воно. в одній з банок шляху був клас 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 . Це вимагало від мене AGES відпрацювати, тому я зрозумів, що я допоможу іншим, хто намагається виправити ці помилки обмеження доступу з командного рядка, опублікувавши цю відповідь.


13
  • Перейдіть до налаштувань Шляху побудови у властивостях проекту. Windows -> Preferences -> Java Compiler
  • Видаліть системну бібліотеку JRE
  • Додайте ще один JRE з "ідеальною відповідністю"
  • очистити та створити свій проект заново. Це працювало для мене.

13

У мене теж була ця проблема. Мабуть, я встановив JRE 1,5, а не 1,6 в моєму шляху побудови.


1
Тут же питання. У моєму випадку, використовуючи Maven, який за замовчуванням до 1,5, якщо не вказано.
Грег Хаскінс

Не забудьте поставити це у свій POM, щоб він не змінювався назад при оновленні. <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> </properties>
Філіп Рего

8

Окрім рішення Нельса Бекмана , у мене є такі поради:

У розділі Налаштувати збірний шлях мені довелося змінити порядок моїх записів під Замовлення та Експорт .

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

Граючи з цими циферблатами, разом із запуском Project> Clean між ними, я зміг вирішити ці попередження.


8

для мене це, як я це вирішую:

  • перейти до шляху побудови поточного проекту

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

  • виберіть " Системна бібліотека JRE [jdk1.8xxx]"
  • натиснути редагувати
  • і виберіть або "JRE (jdk1.8xx)" для робочої області за замовчуванням або альтернативну JRE
  • Клацніть закінчити
  • Натисніть кнопку ОК

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

Примітка: переконайтесь, що в Eclipse / Preferences (НЕ проект) / Java / встановлений JRE, що jdk вказує на папку JDK, а не на JRE C: \ Program Files \ Java \ jdk1.8.0_74

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


У мене вже було встановлено 1,7 ... 79, тому я панікував. Але я просто знову вибрав його, натиснув Застосувати, і помилка пішла. Вау.
Марво

Ого. Це допомогло і тут - перехід від "середовища виконання" до "альтернативного JRE". Якщо у когось є якесь логічне пояснення цього .. (тут це сталося після зміни проекту-крана Java з 1,5 (5,0 у конфігураційному файлі .settings) на 1,8. Перехід від помилки до попередження у глобальних префіксах (див. Іншу відповідь) не став Довідка: все ще помилки. Про старі уроки сонця ми використовуємо з пакету com.sun.image.codec. *)
hyphan

6

Вибачте за оновлення старого POST. Я отримав повідомлення про проблему і вирішив її, як сказано нижче.

Якщо припустимо, що ви використовуєте плагін Eclipse + m2e maven, якщо ви отримали цю помилку обмеження доступу, клацніть правою кнопкою миші проект / модуль, у якому ви маєте помилку -> Властивості -> Шлях збірки -> Бібліотека -> Замініть JDK / JRE до тієї, яка використовується в робочій області eclipse.

Я дотримувався вищезазначених кроків і питання вирішено.


Досить справедливо, але ви в основному повторили формулювання прийнятої відповіді Нельсом Бекманом.
Стівен Вулф

5

Якщо ви впевнені, що вам слід мати доступ до заданого класу, то це може означати, що ви додали до свого проекту кілька банок, що містять класи з однаковими іменами (або шляхами), але різним вмістом, і вони затьмарюють один одного (як правило, старий звичай 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, потім додайте її знову, тобто додайте бібліотеку -> JRE Lib - виберіть jre ---> закінчити. Нарешті, виберіть вкладку " Порядок та експорт" , виберіть JRE Lib та перейдіть вгору. Це воно.


3

Просто змініть порядок побудови бібліотек шляху вашого проекту. Клацніть правою кнопкою миші на проекті> Шлях складання> Налаштування контуру збірки> Виберіть "Замовлення та експорт" (вкладка)> Змінення порядку записів. Я сподіваюсь, що переміщення "Бібліотеки системи JRE" вниз допоможе. Це так працювало для мене. Легко і просто .... !!!


3

У моєму випадку сталася невідповідність між маршрутом збірки JRE та встановленим JRE на середовищі виконання. Я перейшов до проекту> Властивості> компілятор Java. Внизу було попереджувальне повідомлення.

Я натиснув посилання "Встановлений JRE", "Середовище виконання", "Шлях збірки Java" і змінив версію JDK на 1.7, і попередження зникло.


0

Додавання правильної системи JRE через шлях збірки - це рішення, але у затемнення все ще може виникнути помилка. Щоб вирішити це, перейдіть до шляху Java Build -> Замовлення та експорт і перемістіть системну бібліотеку JRE вгорі. Це вирішило мою проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.