Ограничение доступа: Тип "Приложение" - это не API (ограничение на требуемую библиотеку rt.jar)

Вот код:

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)

затмение говорит это:

Ограничение доступа: тип "Приложение" не является API (ограничение для необходимой библиотеки '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')

Ответ 1

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

Справочная информация: ограничения доступа Eclipse

Eclipse имеет механизм, называемый ограничениями доступа, чтобы предотвратить случайное использование классов, которые, по мнению Eclipse, не являются частью общедоступного API. Обычно Eclipse прав в этом в обоих смыслах: мы обычно не хотим использовать что-то, что не является частью публичного API. И Eclipse обычно правы относительно того, что является, а что нет частью публичного API.

проблема

Теперь могут быть ситуации, когда вы хотите использовать общедоступный не-API, такой как sun.misc (не следует, если вы не знаете, что делаете). И могут быть ситуации, когда Eclipse не совсем прав (то, что со мной произошло, я просто хотел использовать javax.smartcardio). В этом случае мы получаем эту ошибку в Eclipse.

Решение

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

  • Перейдите в свойства вашего проекта Java,
    • т.е. выбрав "Свойства" в контекстном меню проекта в "Обозревателе пакетов".
  • Перейдите в "Путь сборки Java", вкладка "Библиотеки".
  • Разверните запись библиотеки
  • Выбрать
    • "Правила доступа",
    • "Редактировать..." и
    • "Добавить..." a "Разрешение: Доступно" с соответствующим шаблоном правила. Для меня это было " javax/smartcardio/** ", для вас это могло бы быть " com/apple/eawt/** ".

Ответ 2

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

Ответ 3

Добавление javafx доступного разрешения в eclipse oxygen перейдите в проект > свойствa > путь сборки Java > библиотеки > затем разверните библиотеки и дважды щелкните по > Правилам доступа там, где вы устанавливаете разрешение Разрешение: Доступно Правило Шаблон: javafx/**

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

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

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

Ответ 4

Начнем с (и не связанного), создание экземпляра класса Application самостоятельно, похоже, не является его предполагаемым использованием. Исходя из того, что можно прочитать из его источника, вы, скорее всего, будете использовать статический экземпляр, возвращаемый getApplication().

Теперь давайте перейдем к сообщениям об ошибках Eclipse. Недавно я столкнулся с похожей проблемой: Access restriction: The method... is not API (restriction on required project). Я назвал этот метод как метод объекта, который унаследовал этот метод от суперкласса. Все, что мне нужно было сделать, это добавить пакет, в котором находился суперкласс, к пакетам, импортированным моим плагином.

Однако существует много разных причин ошибок, основанных на "ограничении требуемого проекта/библиотеки". Подобно проблеме, описанной выше, тип, который вы используете, может иметь зависимости от пакетов, которые не экспортируются библиотекой, или может не экспортироваться сам. В этом случае вы можете попытаться отследить недостающие пакеты и экспортировать их самостоятельно, как предлагается здесь, или попробовать Правила доступа. Другие возможные сценарии включают в себя:

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

Это закончилось скорее как смесь проблем, связанных с ограничениями, чем фактический ответ. Но поскольку ограничение требуемых проектов является такой универсальной ошибкой, о которой следует сообщать, идеальный рецепт, вероятно, еще предстоит найти.

Ответ 5

У меня была эта проблема, потому что фасет проекта, связанный с моим проектом, был неправильной версией Java.

Чтобы исправить это, я сделал следующее:

  • Щелкните правой кнопкой мыши по проекту и выберите "Свойства"
  • Выберите "Границы проекта" и измените версию java на нечто большее 1.4.
  • Нажмите [Применить]

Это приведет к восстановлению вашего проекта и, надеюсь, ошибка будет решена.

Ответ 6

Работало: Свойства проекта → ProjectFacets → Runtimes → jdk1.8.0_45 → Применить

Ответ 7

В верхней строке меню Eclipse:

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

Ответ 8

Нам пришлось изменить наше приложение для сборки под JDK 1.8, используя Window-> Предпочтения → Java-> Установленные JRE. Однако после его изменения системная библиотека JRE, указанная в обозревателе проектов, все еще оставалась неверной. Чтобы это исправить, щелкните правой кнопкой мыши на "Системная библиотека JRE [неправильный-jre-здесь]" и перейдите из среды выполнения: на "Рабочая область по умолчанию (yer-default-here)"

enter image description here

Ответ 9

Если у вас такая же проблема, используя Spring Tool Suite:

Spring Набор инструментов, лежащий в основе IDE, фактически является Eclipse. Я получил эту ошибку только сейчас, пытаясь использовать некоторые классы com.sun.net. Чтобы удалить эти ошибки и предотвратить их появление на платформе STS Eclipse Luna SR1 (4.4.2):

  • Перейдите к проекту > Свойства
  • Развернуть заголовок компилятора Java
  • Нажмите "Ошибки/предупреждения"
  • Развернуть устаревший и ограниченный API
  • Рядом с "Запрещенная ссылка (правила доступа)" выберите "игнорировать"
  • Рядом с "Отклоненная ссылка (правила доступа)" выберите "игнорировать"

Вы хорошо пойдете.

Ответ 10

Была такая же проблема. Вот как я это решил: Зайдите в Package Explorer. Щелкните правой кнопкой мыши Системную библиотеку JRE и перейдите в Свойства. В контейнере Classpath> Выберите JRE для пути сборки проекта выберите третий вариант (JRE рабочей области по умолчанию).

Источник: https://thenewboston.com/forum/topic.php?id=3917.

Ответ 11

Перейдите к следующей настройке:

Окно → Настройки → Java-Compiler-Errors/Warnings-Устаревшие и ограниченные API-запрещенные ссылки (правила доступа)

Установите значение Warning или Ignore.

Ответ 12

В выпуске Eclipse Mars.2 (4.5.2):
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
выберите JRE... и нажмите "Изменить": перейдите в рабочую область JRE (jdk1.8.0_77)

Работает для меня.

Ответ 13

У меня есть eclipse JRE 8.112, не уверен, что это важно, но я сделал это:

  • Щелкните правой кнопкой мыши папку моих проектов
  • перешел к свойствам и нажал
  • щелкните по папке пути сборки java
  • один раз внутри, я был в порядке и экспортировал
  • Я проверил системную библиотеку JRE [jre1.8.0_112]
  • затем переместил его вверх над другой библиотекой JRE (не уверен, что это имело значение)
  • затем нажмите ok

Это решило мою проблему.

Ответ 14

Мы используем IBM Rational Application Developer (RAD) и столкнулись с той же проблемой.

Сообщение об ошибке:

Ограничение доступа: тип 'JAXWSProperties' не является API (ограничение для необходимой библиотеки 'C:\IBM\RAD95\jdk\jre\lib\rt.jar')

Решение:

перейдите к пути сборки Java и на вкладке Библиотека удалите Системную библиотеку JRE. Затем снова Добавить библиотеку → Системная библиотека JRE

Ответ 15

Я просто добавляю e (fx) клипсе на рынке eclipse. Легко и просто

Ответ 16

попробуйте следующее: щелкните правой кнопкой мыши по проекту (в затмении) → выберите "Границы проекта" (левая панель) → выберите "java" (центральная панель) → выберите "Runtimes" (правая панель). там, убедитесь, что "Apache Tomcat" выбран, если нет, затем выберите его, нажмите "применить", а затем "ok"

Ответ 17

Я использую eclipse neon 3. Я просто хотел использовать javafx.application.Application, поэтому я последовал за христианом Хужером, и это сработало. Несколько советов: правила доступа очень похожи на оператор импорта. Для меня правила доступа, которые я добавил, были "javafx/application/**". Просто замените точку в заявлении импорта на прямую косую черту и это правило. Надеюсь, что это поможет.

Ответ 18

У меня была немного другая проблема. В Project - Свойства - Библиотеки - Библиотека JRE у меня была неправильная версия библиотеки JRE. Снимите и установите актуальный, и вуаля - все Access restriction... предупреждений нет.

Ответ 19

Если кто-то сталкивался с этой проблемой только в вашем инструменте CI во время работы с Maven, для меня было уловкой явное определение среды выполнения в вашем MANIFEST.MF.

В моем случае я сделал это, вставив следующую строку в файл манифеста пакета OSGi:

Bundle-RequiredExecutionEnvironment: JavaSE-1.8