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

84

При попытке использовать классы, связанные с 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?

Лексикон
источник
3
Возможно, вы правы, его предложенное решение наполовину сработало для меня. Сработало наполовину, я имею в виду, что если я добавлю JRE с использованием jre «рабочей области по умолчанию» (jdk1.8.0), она будет работать, но при использовании «среды выполнения» JavaSE-1.8 (jdk1.8.0) у меня все еще будет ошибка.
Lexxicon 02

Ответы:

67

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

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

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

Томсонтом
источник
1
В этом есть смысл, я не понимал, что другие виртуальные машины не поддерживают JFX. Я думаю, что на мой первоначальный вопрос невозможно ответить, потому что это не ошибка. К сожалению, я не могу использовать предложенное вами решение из-за некоторых политических соображений.
Lexxicon 02
3
Вы знаете, что все это проекты Eclipse - загрузка «все в одном» - это просто хорошая функция, которая поможет вам быстро начать работу. Вы также можете установить его с Eclipse.org, если хотите. См eclipse.org/efxclipse/install.html
tomsontom
Я знаю, но из-за внутренних ограничений мне не разрешено это использовать. При этом, если вы считаете, что это лучшее решение этой проблемы, я отмечу ваш ответ как правильный.
Lexxicon
5
Просто кое-что сбоку: если вы даже не можете установить плагины eclipse на работе, значит, что-то не так. Ограничение разработчика определенным набором инструментов равносильно ограничению его набора навыков и качества работы.
specializt
135

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

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

Таким образом, минимальное исправление для этого - разрешить доступ к классам в этом файле jar (и только в этом файле jar). Для этого щелкните проект правой кнопкой мыши и откройте диалоговое окно свойств проекта. Выберите «Путь сборки» на левой панели и выберите вкладку «Библиотеки». Вы увидите запись «Системная библиотека JRE». Разверните эту запись, и вы увидите подстатью «Правила доступа»:

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

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

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

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

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

Щелкните OK, чтобы закрыть все диалоговые окна.

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

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

James_D
источник
Есть ли способ настроить это из pom в maven?
RobAu
1
Четкое объяснение
xploreraj
@RobAu См. Здесь работу maven: stackoverflow.com/questions/32565193/…
Стефан
1
Просто и идеально !! :)
Sanket Patel 07
Я вижу это в одной строчке вашего ответа e(fx)clipse is providing many useful development features . В e (fx) clipse 2.6 был добавлен новый элемент, SashPaneисправляющий некоторые SliderPaneпроблемы, но я действительно не могу понять. Есть ли какие-нибудь классы, которые мы можем использовать из e (fx) clipse? Ничего подобного найти не могу. Я имею в виду, что я не могу получить доступ к какому-либо классу или найти что-то полезное, что я могу использовать внутри программы, я имею в виду библиотеку. Исправьте меня, потому что я знаю, что я здесь где-то не так ... :)
GOXR3PLUS
19

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

Луч
источник
1
Я считаю, что причина, по которой это могло сработать для вас, заключается в том, что когда вы добавляете библиотеку jre в путь сборки, она (eclipse), по-видимому, по умолчанию использует jre по умолчанию для рабочей области вместо использования среды выполнения. Поскольку JFX, похоже, не является частью javaSE, среды, которую я выбрал, я сохранил ошибку. Если вы просто добавите рабочую область по умолчанию jre, у нее больше не будет этих ограничений.
Lexxicon
11

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

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

Исходную информацию можно найти здесь: https://www.eclipse.org/efxclipse/install.html#for-the-lazy

Thach Van
источник
Спасибо;) Просто и легко
J. Adam
Работает, спасибо! Только что обновил URL-адрес местоположения на: download.eclipse.org/efxclipse/updates-released/3.6.0/site
Crozeta
7

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

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

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

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

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

Calanais
источник
6
  • перейти к пути сборки текущего проекта

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

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

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

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

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

usertest
источник
4

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

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

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

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

Java-> Compiler-> Просмотр ошибок / предупреждений

и

«Устаревший API с ограничениями»

вы можете установить «Запрещенная ссылка (правило доступа)» на игнорирование.

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


источник
4

Следуй этим шагам:

  1. Добавьте jfxrt.jar (из папки установки) как «Внешний файл JAR» на вкладке «Библиотеки».

  2. На вкладке «Заказ / экспорт» убедитесь, что этот файл jfxrt.jar стоит первым в списке.

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

Natile
источник
3

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

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

ананд
источник
2

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

Вот моя запись в файле пути к классам для контейнера 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>
Стефан
источник
0

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

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

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

Шаг 4: Выберите папку lib и нажмите CTRL + V, чтобы вставить jfxrt.jar [Вставьте ваш jfxrt.jar] [1] [1]: https://i.stack.imgur.com/Ljogu.png

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

Мохд Джахид
источник