首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在模块化java应用程序中加载资源。

无法在模块化java应用程序中加载资源。
EN

Stack Overflow用户
提问于 2020-09-19 15:53:13
回答 2查看 535关注 0票数 1

我正在迁移我的javafx应用程序以使用javafx (JPMS)。除了加载资源之外,一切都正常工作。这个问题没有帮忙。

试图在类Main.kt中加载资源的kotlin代码

代码语言:javascript
复制
javaClass.getResource("/fxml/scene-splash.fxml") // returns null

这是目录结构:

代码语言:javascript
复制
 src
  └───  main
      ├───  kotlin
      │   ├───  com
      │   │   └───  pleon
      │   │       └───  donim
      │   │           ├───  controller
      │   │           └─── Main.kt
      │   └─── module-info.java
      └───  resources
          ├───  img
          ├───  fxml
          │   └─── scene-splash.fxml
          └───  META-INF
              └─── MANIFEST.MF

这是一个模块-info.java

代码语言:javascript
复制
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命令:

代码语言:javascript
复制
"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参数中将资源路径添加为类路径,如下所示:

代码语言:javascript
复制
--class-path out/production/resources

这里是我的完整源代码。

EN

回答 2

Stack Overflow用户

发布于 2020-10-21 21:52:39

在模块中,只有通过open子句才能获得资源,

在JDK 12中,资源目录也被认为是包,所以看上去您正在使用JDK 15??您想要的是kotlin.stdb打开它的资源进行访问。

很难说哪个库有/fxml,但它与此很接近

代码语言:javascript
复制
--add-opens=javafx.fxml/fmx=kotlin.stdb

这是必需的,直到Kotlin为其资源包声明带有打开子句的模块文件,或者通过命令行执行来修改。

票数 0
EN

Stack Overflow用户

发布于 2020-09-19 16:32:43

我想应该是这样的:

假设你有这样的文件夹

代码语言:javascript
复制
  resources
 ├───  img
 ├───  fxml
 |   ├─── scene-splash_controller.java
 │   └─── scene-splash.fxml
 └───  META-INF
     └─── MANIFEST.MF

那你应该去做

scene-splash_controller.getResource("/fxml/scene-splash.fxml");

我会给你举一个在我的电脑上工作的例子。

(它在MainApp类中)

代码语言:javascript
复制
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(MainApp.class.getResource("./StartMenuLayout.fxml"));
    GridPane gp=(GridPane) loader.load();

    //link the fxml controller with MainApp
    StartPage startP=loader.getController();
    startP.setMainApp(this);

更深入的解释是https://stackoverflow.com/a/61531318/12424449

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63970646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档