Использование JavaFX в JRE 8, ошибка "Ограничение доступа"

При попытке использовать связанные с javafx классы в моем новом проекте java 8 я получаю ошибку ограничения доступа от eclipse. Пока что единственное "решение", которое я смог найти, - сказать Eclipse игнорировать ограничение доступа, но я не удовлетворен этим. Пример ошибки:

Access restriction: The type Pane is not accessible due to 
restriction on required library C:\Program Files\Java\jre8_0\lib\ext\jfxrt.jar

Я использую Eclipse Kepler с патчем Eclipse JDT для Java 8.

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

Я сейчас в замешательстве, так как согласно http://en.wikipedia.org/wiki/JavaFX javaFX является частью JavaSE. Возможно ли, что Eclipse не признает, что он является частью javaSE?

11 ответов

Решение

С точки зрения Eclipse ошибка является полностью корректной, поскольку JavaFX исходит из пути к классам расширений и недоступен на ВСЕХ виртуальных машинах Java8 (например, ibm!).

Как указано выше, вы можете подавить эти предупреждения, добавив правила доступа или ИМХО, лучшее решение - установить e(fx)clipse, который делает это автоматически для вас, а также предоставляет инструменты для JavaFX CSS и FXML.

Вы можете получить все в одном пакете с http://efxclipse.bestsolution.at/install.html

Я собираюсь добавить еще один ответ здесь, просто чтобы предоставить то, что я считаю наиболее минимальным подходом. В моей настройке Eclipse у меня установлен e(fx)clipse, который предоставляет одно исправление для этого, а также предоставляет множество полезных функций разработки, которые вам почти наверняка понадобятся, если вы пишете приложения JavaFX. Это, наверное, самый практичный подход. Если по какой-то причине вы не хотите этот плагин, решение, изложенное в этом ответе, решит проблему с наименьшим количеством других побочных эффектов.

Как указано в других ответах, Eclipse по умолчанию запрещает доступ к классам в jar-файлах в каталоге jre/lib/ext, поскольку они не гарантированно присутствуют на всех платформах Java. Если вы пишете приложение на JavaFX 8, вы предполагаете, что находитесь на платформе, где jfxrt.jar доступен в каталоге lib / ext.

Поэтому минимальное исправление для этого - разрешить доступ к классам в этом jar-файле (и только в этом jar-файле). Для этого щелкните правой кнопкой мыши проект и откройте диалоговое окно свойств проекта. Выберите "Build Path" на левой панели и выберите вкладку "Libraries". Вы увидите запись "JRE System Library". Разверните эту запись, и вы увидите подстроку "Правила доступа":

Выберите запись "Правила доступа" и нажмите "Изменить". Нажмите "Добавить".

В разделе "Разрешение" выберите "Доступно", а в разделе "Шаблон правила" введите javafx/**:

Нажмите кнопку ОК, чтобы закрыть все диалоговые окна.

Этот параметр разрешит доступ ко всем классам в любом пакете, начиная javafx., но сохранит правило в папке ext для всех других классов и является "минимальным" в этом смысле.

Опять же, то, что вы, вероятно, действительно хотите сделать, это установить плагин e(fx)clipse, но, насколько мне известно, это решение с наименьшими побочными эффектами в вашей настройке Eclipse.

Я решил проблему, удалив и прочитав JDK в путь сборки. Не спрашивайте меня, почему это работает.

Самый простой способ - установить e (fx) clipse - плагин для Eclipse для поддержки JavaFX:

  1. Выберите Справка -> Установить новое программное обеспечение
  2. Нажмите кнопку Добавить, чтобы добавить следующий сайт:
  3. Нажмите ОК
  4. В разделе "Работа с" выберите недавно добавленный сайт "efxclipse"
  5. Установите флажок "e (fx) clipse - install", чтобы установить все компоненты этого выбора
  6. Перейти к следующим шагам, чтобы завершить установку
  7. Перезапустите свое затмение. Если он все еще не распознает библиотеку JavaFX, перезапустите ее снова.

Оригинальную информацию можно найти здесь: https://www.eclipse.org/efxclipse/install.html.

Я решил эту проблему, осторожно используя путь сборки проекта Eclipse.

  • Откройте свойства проекта приложения и выберите раздел "Путь сборки".
  • Добавьте jre8_0\lib\ext\jfxrt.jar в качестве "внешнего файла JAR" на вкладке "Библиотеки".
  • На вкладке "Порядок / Экспорт" убедитесь, что этот файл jfxrt.jar находится первым в списке.

В результате Eclipse видит jfxrt.jar как обычный JAR-файл стороннего производителя. Порядок важен, так что он имеет приоритет над записью в системной библиотеке JRE. Это тот же самый файл JAR, но Eclipse видит его по-другому.

Вы можете изменить любые конфигурации запуска, чтобы он не использовал "Экспортированную" версию jfxrt.jar; однако на практике это не будет иметь значения.

Я сделал это с Java8 и Eclipse Luna; но основной, я уверен, будет работать с любой комбинацией Java и Eclipse.

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

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

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

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

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

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

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

  1. Я не хочу устанавливать плагин только для того, чтобы избежать ошибочной ошибки.
  2. Добавление jfxrt.jar в качестве внешнего jar будет работать, но это плохая идея, если вы планируете выполнить экспорт, потому что jfxrt.jar также будет экспортироваться. Наверное, не то, что вы хотите.

Другой вариант

В версии 'Mars' (и, возможно, более ранних версиях) вы можете отключить ошибки ограничения доступа. Под

Java-> Компилятор-> Вид ошибок / предупреждений

а также

"Устаревший и ограниченный API"

Вы можете установить "Запрещенная ссылка (правило доступа)", чтобы игнорировать.

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

Следуй этим шагам:
1. Добавьте файл jfxrt.jar (из папки установки) в качестве "внешнего файла JAR" на вкладке "Библиотеки".

  1. На вкладке "Порядок / Экспорт" убедитесь, что этот файл jfxrt.jar находится первым в списке.

это сработало для меня

У меня такая же проблема. Я использовал решение James_D, но его точное решение не сработало для меня. Но используя **/javafx/** вместо javafx/** решил проблему для меня. Надеюсь, это поможет.

PS: Я бы опубликовал это как комментарий в соответствии с решением James_D, но я только что зарегистрировался и мне не хватило "репутации" для этого.

Как уже сказал James_D, я добавил правила доступа в свой файл classpath. Я удалил плагин e(fx)clipse на данный момент, потому что у него есть ошибка проверки css (см. Как отключить предупреждение css "Неизвестное свойство" в Eclipse Mars?).

Вот моя запись в файле classpath для контейнера JRE:

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.‌​launcher.StandardVMType/JavaSE-1.8">
    <attributes>
        <attribute name="maven.pomderived" value="true"/>
    </attributes> 
    <accessrules>
        <accessrule kind="accessible" pattern="javafx/**"/>
        <accessrule kind="accessible" pattern="com/sun/javafx/**"/>
    </accessrules>
</classpathentry>

Шаг 1: Перейдите к вашему jfxrt.jar. C:\Program Files\Java\jre1.8.0_111\lib\ext

Шаг 2 Скопируйте файл jfxrt.jar

Шаг 3: Перейдите в Eclipse, создайте новую папку, например: [Создание папки с именем lib для размещения нашего файла jfxrt.jar][2] [2]:

Шаг 4: Выберите папку lib и нажмите CTRL+V, чтобы вставить jfxrt.jar [Вставьте свой jfxrt.jar] [1] [1]:

Шаг 5: Щелкните правой кнопкой мыши на jfxrt.jar и выберите "Путь сборки".

Другие вопросы по тегам