Обмеження доступу: Тип "Application" не є API (обмеження на необхідну бібліотеку rt.jar)


178

Ось код:

package mscontroller;

import javax.swing.*;
import com.apple.eawt.Application;

public class Main {
    public static void main(String[] args)
    {
        Application app = new Application();
        app.setEnabledAboutMenu(true);

        AMEListener listener = new AMEListener();
        app.addApplicationListener(listener);
        JFrame mainFrame = new JFrame("Application Menu Example");
        mainFrame.setSize(500, 500);
        mainFrame.setVisible(true);
    }
}

ось помилка:

Exception in thread "main" java.lang.Error: Unresolved compilation
problems:   Access restriction: The type 'Application' is not API
(restriction on required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The constructor 'Application()' is not API
(restriction on required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The type 'Application' is not API (restriction on
required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The method
'Application.setEnabledAboutMenu(boolean)' is not API (restriction on
required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    AMEListener cannot be resolved to a type    AMEListener cannot be
resolved to a type

    at mscontroller.Main.main(Main.java:9)

затемнення говорить так:

Обмеження доступу: Тип "Application" не є API (обмеження на необхідну бібліотеку "/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar")


3
Спробуйте запустити це за допомогою Java 7.
spoko

2
Перевірте їх для релевантністю: stackoverflow.com/questions/860187 / ... , stackoverflow.com/questions/9266632 / ...
user2864740

Не використовує Xcode (поки)
www139

Я не знайомий яві, хлопець не дає точного шляху. Що він має на увазі під: com / sun / xml /
Internal

1
Не могли б ви інтерпретувати, про який шлях він говорить? Дякую! В майбутньому я перейду на xCode або netbeans. Хлопець нагорі сказав спробувати java 7 чи варто?
www139

Відповіді:


276

Це сталося і зі мною, і відповіді, надані тут, вже не задовольняли, тому я робив власне дослідження.

Передумови: обмеження доступу до затемнення

Eclipse має механізм, який називається обмеженням доступу, щоб запобігти випадковому використанню класів, які, як вважає Eclipse, не є частиною публічного API. Зазвичай Eclipse має рацію з цього приводу в обох сенсах: ми зазвичай не хочемо використовувати те, що не є частиною публічного API. І Eclipse зазвичай має рацію щодо того, що є, а що не є частиною публічного API.

Проблема

Тепер можуть виникати ситуації, коли ви хочете використовувати загальнодоступний Non-API sun.misc(наприклад, не слід, якщо ви не знаєте, що робите). І можуть бути ситуації, коли Eclipse насправді не так (саме це зі мною трапилось, я просто хотів використати javax.smartcardio). У такому випадку ми отримуємо цю помилку в Eclipse.

Рішення

Рішення полягає в зміні обмежень доступу.

  • Перейдіть до властивостей проекту Java,
    • тобто шляхом вибору "Властивості" з контекстного меню проекту в "Провідник пакетів".
  • Перейдіть до «Шлях збірки Java», вкладка «Бібліотеки».
  • Розгорніть запис бібліотеки
  • виберіть
    • "Правила доступу",
    • "Редагувати ..." і
    • "Додати ..." "Роздільна здатність: доступний" з відповідним шаблоном правил. Для мене це було " javax/smartcardio/**", для вас це може бути " com/apple/eawt/**".

28
У мене Eclipse Mars (4.5.0), і немає правил доступу в Java Build Path -> Бібліотеки. FWIW є більший молоток (ви можете їх вимкнути) у налаштуваннях -> Java -> компілятор -> помилки / попередження -> застарілий та обмежений API.
Джонатан Росс

4
У мене Eclipse Mars.1 Випуск (4.5.1). Для мене обидва рішення спрацювали. Відповідь Крістіана та коментар Джонатана. На вкладці "Бібліотеки" ви повинні відкрити один із перелічених "JARs та папок класів", щоб побачити, що "Правила доступу" належать йому.
Ласло Хірді

3
Це НЕ працює для мене. Затемнення Луни. Спробував JDK 1.8, 1.7, додав правила доступу, чистий проект, помилки продовжують повертатися. Також спробував пропозицію @JonathanRoss - перший на рівні проекту. Там, хоча конфігурації на рівні проекту для заборонених / відключених API були встановлені на попередження, я все-таки отримав помилки. Потім я спробував (як запропонував Джонатан), переглянувши налаштування параметрів рівня робочої області, і ТОМ, заборонені API були встановлені на помилку. Якщо змінити попередження, це призвело до усунення проблеми, але налаштування рівня проекту повинно було б змінити, подумайте, що це помилка в Eclipse.
Стів Коен

2
Мені не було дозволено змінювати обмеження доступу в моєму випадку: Eclipse Neon з проектом jar-jar на jar "jfxrt.jar".
pdem

3
Існує більш простий варіант: видалення і додавання назад System Library JRE, як вказувалося в stackoverflow.com/a/2174607/222838
Міко

81

У мене була така ж проблема. Коли я спочатку створив проект java в Eclipse, я вказав JRE 8. Коли я пішов у шлях створення проекту та відредагував системну бібліотеку JRE, було обрано середовище виконання Java 8. Коли я вирішив використати "Alernate JRE" (все ще java 8), він виправив помилку для мене.


2
Я вважаю за краще глобальне виправлення, але це краще, ніж усі інші відповіді, які дозволяють обмежено API в усьому світі. (Я не хочу випадково використовувати сонце. * У моєму додатку javafx).
Марк Єронімус

1
Дякую, це очистило всі попередження в моєму проекті. Eclipse скаржився на всі класи, які надав JavaFX (jfxrt.jar)
Горан Васич

2
Підтверджено ... Я змінив JRE 8 u60 на ... JRE 8 u60. Мабуть, ця відновлення, яке було запущено, на відміну від будь-якого іншого способу, має побічний ефект виправлення проблеми. (Більш детальне пояснення, як змінити цей параметр, дивіться відповідь Нікхіла Махаджана тут: stackoverflow.com/questions/6881622/… .)
старший старший

Дякую! За допомогою цієї стратегії я зміг успішно скласти рамки іскри ява.
Мартін Пабст

1
Дивно це спрацювало. У мене встановлений лише один JDK. Як дивно.
WesternGun

65

Додавши дозвіл javafx на кисень затемнення, перейдіть до проекту> властивості> шлях до збірки Java> бібліотеки> потім розгорніть бібліотеки та двічі клацніть на> Правила доступу там ви встановите дозвіл Розв’язання: Доступний шаблон правила: javafx / **

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

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

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


23

Для початку ( і не пов’язаних між собою ), ідентифікація Applicationкласу самостійно не здається його цільовим використанням. З того, що можна прочитати з його джерела , ви швидше використовуєте статичний екземпляр, повернений getApplication().

Тепер перейдемо до звітів про помилки Eclipse. Я зіткнувся з подібним питанням в останній час : Access restriction: The method ... is not API (restriction on required project). Я назвав розглянутий метод як метод об'єкта, який успадкував цей метод від суперкласу. Все, що мені потрібно було зробити, це додати пакет, до якого надходив суперклас, до пакетів, імпортованих моїм плагіном.

Однак існує маса різних причин помилок, заснованих на "обмеженні необхідного проекту / бібліотеки ". Подібно до описаної вище проблеми, тип, який ви використовуєте, може залежати від пакетів, які не експортуються бібліотекою, або можуть не експортуватися самі. У такому випадку ви можете спробувати відшукати відсутні пакети та експортувати їх самостійно, як тут пропонується , або спробувати Правила доступу. Інші можливі сценарії включають:

  • Eclipse хоче запобігти використанню доступних пакетів, які не входять до загальнодоступного Java API (рішення 1 , 2 )
  • Залежності задовольняються різними джерелами, версії суперечать ін. (Рішення 1 , 2 , 3 )
  • Eclipse використовує JRE там, де потрібен JDK (що може бути і у випадку, коли говорять про ваші помилки; рішення ) або версія JRE / JDK у шляху створення проекту не є правильним.

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


18

У мене була ця проблема, оскільки фасета проекту, пов'язана з моїм проектом, була неправильною версією Java.

Щоб виправити це, я зробив наступне:

  1. Клацніть правою кнопкою миші на проект та виберіть Властивості
  2. Виберіть "Фасетки проекту" та змініть версію Java на щось більше, ніж 1,4.
  3. Клацніть [Застосувати]

Це відновить ваш проект, і, сподіваємось, помилка буде усунена.


15

Нам довелося змінити наш додаток для побудови на JDK 1.8, використовуючи Window-> Preferences-> Java-> Installed JRE . Однак, змінивши це, системна бібліотека JRE, зазначена в Провіднику проектів, все ще була неправильною. Щоб виправити це, клацніть правою кнопкою миші на "Бібліотека системи JRE [неправильно-jre-тут]" і перейдіть з середовища виконання: на "Стандартна робоча область (yer-default-here)"

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


1
Дякую! Це безпечне моє життя :)
KMC

13

Працювало: Властивості проекту -> ProjectFacets -> Виконання -> jdk1.8.0_45 -> Застосувати


система зависла :(
Saikat

12

У верхньому рядку меню Eclipse:

Windows -> Preferences -> Java -> Compiler -> Errors/Warnings -> 
Deprecated and restricted API -> Forbidden reference (access rules): -> change to warning

9

Якщо у вас виникли такі самі проблеми за допомогою Spring Tool Suite:

Основним IDE Spring Tool Suite є насправді Eclipse. Я отримав цю помилку саме зараз, намагаючись використовувати деякі com.sun.netкласи. Щоб видалити ці помилки та не допустити їх появи на платформі Eclipse Luna SR1 (4.4.2) STS:

  • Перейдіть до проекту> Властивості
  • Розгорніть заголовок Java Compiler
  • Клацніть на помилки / попередження
  • Розгорніть застарілий та обмежений API
  • Поруч із "Заборонене посилання (правила доступу)" виберіть "ігнорувати"
  • Поруч із пунктом "Прихована посилання (правила доступу)" виберіть "ігнорувати"

Ти добре підеш.


6

Була така ж проблема. Ось як я це вирішив: перейдіть до програми Explorer Package. Клацніть правою кнопкою миші на системній бібліотеці JRE та перейдіть до Властивості. У контейнері Classpath> Select JRE для шляху побудови проекту виберіть третій варіант (JRE) за замовчуванням для робочої області.

Джерело: https://thenewboston.com/forum/topic.php?id=3917


1
Дякую ... використовуючи відповідь, запропоновану C Hujer, я фактично виявив, що для файлу jfxrt.jar було "162 правила (не змінюються)"!
мійський гризун

5

Перейдіть до наступного налаштування:

Вікно -> Налаштування -> Java-компілятор-помилки / попередження-застарілі та обмежені API-посилання, заборонені (правила доступу)

Установіть його на Warningабо Ignore.


5

Ми використовуємо IBM Rational Application Developer (RAD) і мали таку ж проблему.

Повідомлення про помилку:

Обмеження доступу: Тип "JAXWSProperties" не є API (обмеження на необхідну бібліотеку "C: \ IBM \ RAD95 \ jdk \ jre \ lib \ rt.jar")

Рішення:

перейдіть на шлях збірки Java та на вкладці Бібліотека видаліть системну бібліотеку JRE. Потім знову Додати бібліотеку -> системна бібліотека JRE


4

У програмі Eclipse Mars.2 Release (4.5.2):
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
виберіть JRE ... та натисніть «Правка»: переключиться на робочу область JRE (jdk1.8.0_77)

Працює для мене.


3

У мене затемнення JRE 8.112, не впевнений, що це має значення, але що я зробив:

  1. Клацніть правою кнопкою миші на папці моїх проектів
  2. спустився до властивостей і натиснув
  3. натиснув папку шляху побудови Java
  4. потрапивши всередину, я був в порядку і на експорт
  5. Я перевірив системну бібліотеку JRE [jre1.8.0_112]
  6. потім перемістив його вище однієї іншої системної бібліотеки JRE там (не впевнений, чи це має значення)
  7. потім натиснув гаразд

Це вирішило мою проблему.



1

Я використовую неон 3. затемнення. Я просто хотів використовувати javafx.application.Application, тому я дотримувався відповіді Крістіана Гуджера вище, і це спрацювало. Лише кілька порад: правила доступу дуже схожі на заяву про імпорт. Для мене правила доступу, які я додав, були "javafx / application / **". Просто замініть крапку в операторі імпорту пересічною косою рисою, і це правило. Сподіваюся, що це допомагає.


1

У мене була дещо інша проблема. У бібліотеці Project - Властивості - Бібліотеки - JRE, у мене була неправильна версія файлу JRE. Вийміть і встановіть фактичне, а вуаля - усі Access restriction...попередження відсутній.


1

Навіть якщо його старе питання, для мене в Eclipse я просто клацніть правою кнопкою миші на папці та властивості Src (Alt + Enter) і перевірте на Ignore optional compile problemsвилучену помилку.

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


0

Якщо у когось виникає ця проблема лише у вашому інструменті CI під час роботи Maven, для мене фокусом було чітко визначити середовище виконання у вашому MANIFEST.MF.

У моєму випадку я це зробив, вставивши наступний рядок у мій файл маніфестів пакету OSGi:

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