【问题标题】:Module not exporting exception in javafx 12模块未在 javafx 12 中导出异常
【发布时间】:2020-01-22 19:24:30
【问题描述】:

我将 Intellij 与 javafx 12 一起用作单独的库。我设法使它工作。我做了一个游戏,图形效果很好。现在我想创建一个带有一些按钮的菜单。当我尝试将按钮添加到场景的根目录时,它会引发异常,但有以下异常:

Exception in thread "JavaFX Application Thread" java.lang.IllegalAccessError: superclass access check failed: class com.sun.javafx.scene.control.ControlHelper (in unnamed module @0x77b376ef) cannot access class com.sun.javafx.scene.layout.RegionHelper (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene.layout to unnamed module @0x77b376ef

我用谷歌搜索了一些关于堆栈溢出的解决方案,这对我不起作用。我的命令行参数如下(基于这些解决方案):

--module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \
--add-modules=javafx.swing,javafx.graphics,javafx.fxml,javafx.media,javafx.web,javafx.scene,javafx.controls \
-p "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.base.jar" : \
   "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.graphics.jar"  \
--add-exports javafx.graphics=ALL-UNNAMED \
--add-exports javafx.controls/com.sun.javafx.charts=ALL-UNNAMED \
--add-exports javafx.graphics/com.sun.javafx.iio=ALL-UNNAMED \
--add-exports  javafx.graphics/com.sun.javafx.iio.common=ALL-UNNAMED \
--add-exports  javafx.graphics/com.sun.javafx.css=ALL-UNNAMED \
--add-exports  javafx.base/com.sun.javafx.runtime=ALL-UNNAMED \
--add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED \
--add-exports javafx.graphics/com.sun.javafx.scene.layout=ALL-UNNAMED

谢谢!

编辑 1:最小可重现示例

  1. 下载最新的intellij
  2. 创建一个新的 javafx 模板项目
  3. 添加 javafx 库
  4. 将以下行添加到运行配置中的命令行参数

    --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \ --add-modules javafx.fxml,javafx.controls

注意:请检查库的路径是否正确。

  1. 将启动方式改为如下:

    @覆盖 公共无效开始(阶段主要阶段)抛出异常{ 按钮按钮 = 新按钮(); primaryStage.setTitle("Hello World"); primaryStage.setScene(new Scene(new Group(), 300, 275)); 主舞台.show(); }

重要提示:请确保按钮来自 javafx,而不是 awt 库!如果您错误地从 awt 导入按钮,这将起作用。

按钮永远不会添加到根目录(也不会添加到场景中),如果您评论创建按钮的行,一切正常!

编辑 2:

看起来我正在运行我创建的配置,因为 intellij 创建的命令行(当我单击...时)如下:

"C:\Program Files\Java\jdk-12.0.2\bin\java.exe" --add-modules javafx.base,javafx.graphics --add-reads javafx.base=ALL-UNNAMED --add-reads javafx.graphics=ALL-UNNAMED "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1\lib\idea_rt.jar=50712:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\dusan\Documents\untitled\out\production\untitled;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.web.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.swing.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.media.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.graphics.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.fxml.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.controls.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.base.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx-swt.jar" -p "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.base.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.graphics.jar" sample.Main --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \ --add-modules javafx.fxml,javafx.controls

【问题讨论】:

  • 您在question 中遇到了问题,但是您正在添加 VM 选项。唯一的解释是您没有运行您创建的配置。因此,请确保您确实运行它。还要检查你点击运行时 IntelliJ 创建的命令行(你可以点击运行窗口中的...
  • 我编辑了答案。看起来我正在运行配置,基于 intellij 创建的命令行。此外,如果我在场景中添加例如圆圈(并注释按钮行),它会按预期工作。所以我怀疑问题出在 javafx.controls 上。您能否验证这个最小示例是否适用于您的机器?谢谢!
  • 在编辑 2 的命令行中,VM 参数添加到 主类之后,因此它们被解释为运行时参数。确保将它们添加为 VM 参数
  • 哦,非常感谢,这就是问题所在。我不知道为什么我将这些命令添加为命令行参数,而不是 VM 选项...

标签: java javafx java-module java-12


【解决方案1】:

答案在你的命令行中:

--module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \
...
-p "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.base.jar" : \
   "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.graphics.jar"  \

注意选项-p--module-path 完全相同(参见JEP 261 中的应用程序模块路径)。

这意味着您添加了两次,但只有最后一次占上风。所以只有javafx-basejavafx-graphics 被添加到模块路径中,因此javafx-controls 没有。这解释了异常(与 com.sun.javafx.scene.control.ControlHelper 相关),以及您不必要地添加了所有这些 --add-exports 的事实。

可能你不会使用 Swing、Media 或 Web,所以这个命令行就足够了:

--module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \
--add-modules javafx.fxml,javafx.controls

这些虚拟机选项可以在您的 IDE 中设置。

所有这些都在此处正确记录:https://openjfx.io/openjfx-docs/(另请查看特定 IDE 的文档)。

【讨论】:

  • 不幸的是,我又遇到了同样的异常。我认为我的第一个命令行参数是那些,然后我开始根据堆栈溢出答案添加其他参数。
  • 如果您不知道如何应用,添加其他人的解决方案将不起作用。我强烈建议您阅读我上面链接的文档。如果您使用 IDE,请确保正确设置 VM 选项。您还可以使用有助于重现您的问题的更多详细信息来编辑和更新您的问题。
  • 我编辑了我的答案并添加了最小的可重现示例。谢谢!
猜你喜欢
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2012-04-16
  • 1970-01-01
  • 2021-10-12
相关资源
最近更新 更多