java - javafx 12 中模块未导出异常

标签 java javafx java-module java-12

我将 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

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

  • 将启动方法更改为以下内容:

    @覆盖 公共(public)无效开始(阶段primaryStage)抛出异常{ 按钮按钮 = new Button(); PrimaryStage.setTitle("Hello World"); PrimaryStage.setScene(new Scene(new Group(), 300, 275)); PrimaryStage.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
    

    最佳答案

    答案就在你的命令行中:

    --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-的事实导出

    您可能不会使用 Swing、Media 或 Web,因此这个命令行就足够了:

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

    这些 VM 选项可以在您的 IDE 中设置。

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

    关于java - javafx 12 中模块未导出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58050326/

    相关文章:

    java - 在 JavaFX 中将反射应用于 DropShadow 效果

    java - 使用 Xuggler 将音频(aac)和视频(mp4 容器中的 h.264)合并到 mp4 容器中

    java - 无法在 JavaFX UI 中重用文本字段

    java - 通过 ajax 将数组传递给 servlet 给出 null 参数

    java - DateFormat 给出错误答案

    java - 正确舍入非终止(无理数)BigDecimal

    java - 如何正确抑制 "requires transitive directive for an automatic module"警告?

    java - 在 javafx 中向文本字段添加特殊字符

    java - Eclipse maven编译器不支持编译器插件compilerArgs

    java - 如何列出所有 JPMS 服务?