Ограничение доступа: тип «Приложение» не является 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)

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

Ограничение доступа: тип «Приложение» не является 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

Я не знаком с Java, парень не дает точного пути. Что он имеет в виду: com / sun / xml / internal / **
www139

1
Не могли бы вы объяснить, по какому пути он идет? Спасибо! В будущем я переключусь на xCode или netbeans. Парень выше сказал, чтобы попробовать Java 7 я должен?
www139

Ответы:


276

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

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

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

проблема

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

Решение

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

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

28
У меня есть Eclipse Mars (4.5.0) и нет никаких правил доступа в Java Build Path -> Libraries. Впрочем, в настройках -> Java -> Компилятор -> Ошибки / предупреждения -> Устаревший и ограниченный API есть больший молоток (вы можете отключить их все).
Джонатан Росс

4
У меня есть Eclipse Mars.1 Release (4.5.1). Для меня оба решения работали. Ответ от Кристиана и комментарий от Джонатана. На вкладке Библиотеки вы должны открыть один из перечисленных «JAR-файлов и папок классов», чтобы увидеть, что «Правила доступа» к нему принадлежат.
Ласло Хирди

3
Это НЕ работает для меня. Затмение Луны. Пробовал JDK 1.8, 1.7, добавлены правила доступа, чистый проект, ошибки продолжают возвращаться. Также попробовал предложение @JonathanRoss - сначала на уровне проекта. Там, хотя конфиги уровня Project для API Forbidden / Discouraged были установлены в Warning, я все еще получал ошибки. Затем я попытался (как предложил Джонатан) пройти через настройки параметров уровня рабочей области, и ТАМ, Forbidden APIs были установлены на Error. При переходе к предупреждению проблема исчезла, но настройка уровня проекта должна была быть переопределена, думаю, это ошибка в Eclipse.
Стив Коэн

2
Мне не разрешили изменить ограничение доступа в моем случае: Eclipse Neon с проектом maven 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 во всем мире. (Я не хочу случайно использовать sun. * В моем приложении javafx).
Марк Жеронимус

1
Спасибо, это очистило все предупреждения в моем проекте. Eclipse жаловался на все классы, которые были предоставлены JavaFX (jfxrt.jar)
Горан Васич

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

Спасибо! С помощью этой стратегии я смог успешно скомпилировать фреймворк spark java.
Мартин Пабст

1
Странно это сработало. У меня установлен только один JDK. Как странно.
WesternGun

65

Чтобы добавить доступное разрешение javafx в eclipse oxygen, перейдите в проект> свойства> путь сборки java> библиотеки>, затем разверните библиотеки и дважды щелкните> «Правила доступа», для которых вы устанавливаете разрешение. Разрешение: Шаблон правила доступа: javafx / **

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

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

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


23

Начнем с ( и не связанного ), создание экземпляра 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 в пути сборки проекта не является правильной

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


18

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

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

  1. Щелкните правой кнопкой мыши по проекту и выберите «Свойства».
  2. Выберите «Фасеты проекта» и измените версию Java на версию, превышающую 1.4.
  3. Нажмите [Применить]

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


15

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

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


1
Спасибо! Это безопасно моей жизни :)
KMC


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

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

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


1
Спасибо ... используя ответ, предложенный C Hujer, я обнаружил, что для файла jfxrt.jar существует "162 правила (не изменяемые)"!
Майк Грызун

5

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

Окно -> Настройки -> Ошибки Java-компилятора / Предупреждения-устаревшая и ограниченная ссылка API-Forbidden (правила доступа)

Установите это 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. затем нажал ОК

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


2

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


1

Я использую Eclipse Neon 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.