Java адский пакет пытается использовать JavaFX на MacOS + IntelliJ - PullRequest
0 голосов
/ 30 марта 2020

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

Я использую IntelliJ CE 2019.3.3, работающий на MacOS Catalina 10.15.4, с Java 14, который я понимаю как Последняя версия. Как это ни парадоксально, я боюсь, что использование последней версии JDK может быть root всех моих проблем, учитывая кажущуюся извилистую историю JavaFX и ее связь с мейнстримом Java (спасибо Oracle).

Я скачал тривиальное приложение, которое добавило в сцену несколько простых фигур, которые мне удалось успешно запустить. Я добавил библиотеки JavaFX в свой проект, добавив две зависимости к моему pom. xml:

<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-controls</artifactId>
    <version>11</version>
</dependency>

<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-graphics</artifactId>
    <version>11</version>
</dependency>

Примечание. Я предполагаю (возможно, неправильно), что управление версиями JavaFX выполняется независимо от управления версиями JDK .

К сожалению, в тот момент, когда я добавляю что-то даже немного сложное в эту программу, я получаю следующую ошибку:

/Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home/bin/java --add-modules FXTest.base,FXTest.graphics --add-reads FXTest.base=ALL-UNNAMED --add-reads FXTest.graphics=ALL-UNNAMED -Dfile.encoding=UTF-8 -classpath /Users/Joe/Programming/myproj-mvn/target/classes:/Users/Andy/.m2/repository/org/junit/jupiter/junit-jupiter/5.4.2/junit-jupiter-5.4.2.jar:/Users/Andy/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.4.2/junit-jupiter-api-5.4.2.jar:/Users/Andy/.m2/repository/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0.jar:/Users/Andy/.m2/repository/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar:/Users/Andy/.m2/repository/org/junit/platform/junit-platform-commons/1.4.2/junit-platform-commons-1.4.2.jar:/Users/Andy/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.4.2/junit-jupiter-params-5.4.2.jar:/Users/Andy/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.4.2/junit-jupiter-engine-5.4.2.jar:/Users/Andy/.m2/repository/org/junit/platform/junit-platform-engine/1.4.2/junit-platform-engine-1.4.2.jar:/Users/Andy/.m2/repository/org/apache/commons/commons-csv/1.8/commons-csv-1.8.jar:/Users/Andy/.m2/repository/org/openjfx/FXTest-controls/11/FXTest-controls-11.jar:/Users/Andy/.m2/repository/org/openjfx/FXTest-controls/11/FXTest-controls-11-mac.jar:/Users/Andy/.m2/repository/org/openjfx/FXTest-graphics/11/FXTest-graphics-11.jar:/Users/Andy/.m2/repository/org/openjfx/FXTest-graphics/11/FXTest-graphics-11-mac.jar:/Users/Andy/.m2/repository/org/openjfx/FXTest-base/11/FXTest-base-11.jar:/Users/Andy/.m2/repository/org/openjfx/FXTest-base/11/FXTest-base-11-mac.jar:/Users/Andy/.m2/repository/org/apache/logging/log4j/log4j-api/2.13.1/log4j-api-2.13.1.jar:/Users/Andy/.m2/repository/org/apache/logging/log4j/log4j-core/2.13.1/log4j-core-2.13.1.jar -p /Users/Andy/.m2/repository/org/openjfx/FXTest-base/11/FXTest-base-11-mac.jar:/Users/Andy/.m2/repository/org/openjfx/FXTest-graphics/11/FXTest-graphics-11-mac.jar net.foobar.myproj.FXTest
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at FXTest.graphics/com.sun.FXTest.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at FXTest.graphics/com.sun.FXTest.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.IllegalAccessError: class FXTest.scene.control.PopupControl (in unnamed module @0x5b464ce8) cannot access class com.sun.FXTest.application.PlatformImpl (in module FXTest.graphics) because module FXTest.graphics does not export com.sun.FXTest.application to unnamed module @0x5b464ce8
    at FXTest.scene.control.PopupControl.<clinit>(PopupControl.java:90)
    at net.foobar.myproj.FXTest.main(FXTest.java:24)
    ... 11 more
Exception running application net.foobar.myproj.FXTest

Process finished with exit code 1

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

--add-modules
javafx.controls
-p
/Users/Joe/Downloads/openjfx/javafx-sdk-11.0.2/lib

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

Чувствуется, что использование библиотек JavaFX в двух разных местах совершенно неуместно - мои Загрузки * Каталог 1021 * и мой локальный .m2 Maven репозиторий.

Может кто-нибудь предложить лучшее решение моей боли - либо альтернативный пакет 3D, либо лучший способ управления библиотеки JavaFX?


Редактирование моего вопроса, чтобы показать достигнутый мной прогресс (например, sh Я мог бы добавить больше деталей другим способом).

Ладно, после того, как я немного зализала свои раны, я решил выпить Maven Kool-aid, вплоть до самого дна чашки.

Сначала я создал проект Maven , основанный на javafx-archetype-simple . Я нашел это, перейдя по ссылке с плагина Maven для сайта JavaFX . Сделав это, я смог скомпилировать код, используя mvn compile , а затем запустить его, используя mvn javafx: run . Результат = успех!

Окрыленный радостью, я решил импортировать проект в IntelliJ - со смешанными результатами. Мне пришлось изменить конфигурацию 'run', чтобы использовать плагин mvn (см. Выше), и эта часть, кажется, работает.


Обновление № 2: я теперь улучшил свой Команда IDE 'run configuration' для mvn-компиляции javafx: run , которая заставляет код перекомпилироваться перед его запуском (если необходима перекомпиляция - maven такой умный).

Wi sh мне повезло - я буду обновлять этот пост по мере продолжения.

1 Ответ

0 голосов
/ 19 апреля 2020

Я столкнулся с аналогичными трудностями при попытке использовать параметр --add-modules.

Поэтому вместо этого я создал этот файл:

src/module-info.java

С содержанием ниже:

module MyProject{
    requires javafx.controls;
}

Вы можете найти полный рабочий пример здесь: https://carlfx.wordpress.com/2016/04/26/a-javafx-helloworld-using-java-9s-project-jigsaw-in-60-seconds/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...