模块不在 javafx 12 中导出异常
Module not exporting exception in javafx 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:最小可重现示例
- 下载最新的intellij
- 创建一个新的 javafx 模板项目
- 添加 javafx 库
将以下行添加到 运行 配置中的命令行参数
--模块路径"C:\Program Files\Java\javafx-sdk-11.0.2\lib" \--添加模块javafx.fxml,javafx.controls
注意:请检查库的路径是否正确。
将启动方式改为如下:
@Override
public void start(Stage primaryStage) 抛出异常{
按钮 button = new Button();
primaryStage.setTitle("Hello World");
primaryStage.setScene(新场景(新组(), 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-base
和 javafx-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
这些 VM 选项可以在您的 IDE 中设置。
所有这些都在此处正确记录:https://openjfx.io/openjfx-docs/(另请查看您的特定 IDE 的文档)。
我将 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:最小可重现示例
- 下载最新的intellij
- 创建一个新的 javafx 模板项目
- 添加 javafx 库
将以下行添加到 运行 配置中的命令行参数
--模块路径"C:\Program Files\Java\javafx-sdk-11.0.2\lib" \--添加模块javafx.fxml,javafx.controls
注意:请检查库的路径是否正确。
将启动方式改为如下:
@Override public void start(Stage primaryStage) 抛出异常{ 按钮 button = new Button(); primaryStage.setTitle("Hello World"); primaryStage.setScene(新场景(新组(), 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-base
和 javafx-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
这些 VM 选项可以在您的 IDE 中设置。
所有这些都在此处正确记录:https://openjfx.io/openjfx-docs/(另请查看您的特定 IDE 的文档)。