gpt4 book ai didi

Java 包 hell 尝试在 MacOS + IntelliJ 上使用 JavaFX

转载 作者:行者123 更新时间:2023-12-01 17:42:03 27 4
gpt4 key购买 nike

我正在尝试开发一个需要能够在 3D 空间中查看/操作模型的应用程序,JavaFX 似乎是一个明显的候选者。如果有人可以提出更好的选择,那么我会很高兴听到它!

我正在使用在 MacOS Catalina 10.15.4 上运行的 IntelliJ CE 2019.3.3,以及 Java 14,据我所知这是最新版本。矛盾的是,鉴于 JavaFX 明显曲折的历史及其与主流 Java 的关系(感谢 Oracle),我担心使用最新的 JDK 可能是我所有问题的根源。

我下载了一个简单的应用程序,它向场景添加了一些简单的形状,我成功地运行了它。我通过向 pom.xml 添加两个依赖项来将 JavaFX 库添加到我的项目中:

<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 库下载到新目录并将以下选项添加到我的运行时 VM 选项中,我能够克服这个问题:

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

不幸的是,我发现当我将新类导入到我的应用程序中时,我遇到了此错误的变体,其方式我发现非常不可预测(并且很难修复)。我的灵感和耐心都快耗尽了,而且也没有足够的模块可以添加到 VM 选项列表中。

在两个不同的位置使用 JavaFX 库也感觉很俗气 - 我的 Downloads 目录和我的本地 .m2 Maven 存储库。

任何人都可以提出更好的解决方案来解决我的痛苦 - 替代的 3D 包或管理 JavaFX 库的更好方法吗?

<小时/>

编辑我的问题以显示我所取得的进展(希望我能以其他方式添加更多详细信息)。

好吧,在舔了一会儿伤口后,我决定喝Maven酷爱饮料,一直喝到杯底。

我首先创建了一个Maven项目,基于javafx-archetype-simple 。我通过 Maven plugin for JavaFX 中的链接找到了这个地点。完成此操作后,我可以使用 mvncompile 编译代码,然后使用 mvn javafx:ru​​n 运行它。结果=成功!

我欣喜若狂,然后决定将项目导入 IntelliJ - 结果好坏参半。我必须修改“运行”配置,才能使用 mvn 插件(见上文),并且该部分似乎可以工作。

<小时/>

更新 #2:我现在已将 IDE 的“运行配置”命令增强为 mvncompile javafx:ru​​n,这会强制代码在运行之前重新编译(如果需要重新编译 - maven)就这么聪明)。

祝我好运 - 我会继续更新这篇文章。

最佳答案

我在尝试使用 --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/

关于Java 包 hell 尝试在 MacOS + IntelliJ 上使用 JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60936500/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com