问题描述
我正在迁移javafx应用程序以使用Java模块(JPMS)。除了加载资源之外,一切都正常。 This question或this并没有帮助。
试图加载类 Main.kt 中的资源的kotlin代码:
javaClass.getResource("/fxml/scene-splash.fxml") // returns null
这是目录结构:
? src
└─── ? main
├─── ? kotlin
│ ├─── ? com
│ │ └─── ? pleon
│ │ └─── ? donim
│ │ ├─── ? controller
│ │ └─── Main.kt
│ └─── module-info.java
└─── ? resources
├─── ? img
├─── ? fxml
│ └─── scene-splash.fxml
└─── ? meta-inf
└─── MANIFEST.MF
这是 module-info.java :
module donim.application {
requires java.base;
requires java.desktop;
requires kotlin.stdlib;
requires javafx.base;
requires javafx.graphics;
requires javafx.controls;
requires javafx.media;
requires javafx.fxml;
// The com.jhlabs:filters library
requires filters;
exports com.pleon.donim;
exports com.pleon.donim.node;
opens com.pleon.donim.controller;
}
这是IntelliJ执行的完整Java命令:
"C:\Program Files\Java\jdk-15\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 2020.2\lib\idea_rt.jar=3702:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2\bin"
-Dfile.encoding=UTF-8
-p
D:\IdeaProjects\donim\out\production\classes;
D:\IdeaProjects\donim\out\production\resources;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-base\15\df61e6a8cfba8e36f598e3fa4d40fd51561efdf8\javafx-base-15-win.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-graphics\15\979ac3da4288de1e8103c2b38eb7aa74d32fe1b8\javafx-graphics-15-win.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-jdk8\1.4.10\998caa30623f73223194a8b657abd2baec4880ea\kotlin-stdlib-jdk8-1.4.10.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-fxml\15\a5a853b7f1f821c98bc49819dbe6c3792e4f3e1a\javafx-fxml-15-win.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-controls\15\c2fffd91566c6c26bf0cb6c514be271b897f0254\javafx-controls-15.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-controls\15\9424a90300b37786c9072f08d7a791fa9b6be13e\javafx-controls-15-win.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-media\15\b53695aa0c89e910ac27fbb685c0a6066dac590e\javafx-media-15-win.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-graphics\15\2a472aea82dc19b0f3b5b349277e6520b39c4b9\javafx-graphics-15.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-base\15\c6db58e57b76f797f6b1abf763e173f0d1b9b810\javafx-base-15.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\com.jhlabs\filters\2.0.235-1\fff65ebe39d1097cee431087858b3caf957ecfb7\filters-2.0.235-1.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-jdk7\1.4.10\30e46450b0bb3dbf43898d2f461be4a942784780\kotlin-stdlib-jdk7-1.4.10.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib\1.4.10\ea29e063d2bbe695be13e9d044dcfb0c7add398e\kotlin-stdlib-1.4.10.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-common\1.4.10\6229be3465805c99db1142ad75e6c6ddeac0b04c\kotlin-stdlib-common-1.4.10.jar;
C:\Users\ABC\.gradle\caches\modules-2\files-2.1\org.jetbrains\annotations\13.0\919f0dfe192fb4e063e7dacadee7f8bb9a2672a9\annotations-13.0.jar
-m donim.application/com.pleon.donim.Main
我当前的解决方法是在IntelliJ jvm参数中将资源的路径添加为类路径:
--class-path out/production/resources
解决方法
我认为它应该像这样工作:
假设您有类似的文件夹
https:
那你应该做
scene-splash_controller.getResource(“ / fxml / scene-splash.fxml”);
我会给你一个可以在我的电脑上运行的例子
(在MainApp类中)
? resources
├─── ? img
├─── ? fxml
| ├─── scene-splash_controller.java
│ └─── scene-splash.fxml
└─── ? META-INF
└─── MANIFEST.MF
https://stackoverflow.com/a/61531318/12424449
中有更深入的解释 ,在模块中,资源只能通过opens子句获得,
从JDK 12开始,资源目录也被视为软件包,因此请注意,您正在使用JDK 15- 您想要的是kotlin.stdb打开其资源以供访问
很难告诉哪个库具有/ fxml,但与此相似的地方
--add-opens=javafx.fxml/fmx=kotlin.stdb
这是必需的,直到Kotlin为其资源包声明带有open子句的模块文件,或者通过命令行执行对其进行修改。