首页 > 解决方案 > JavaFX - 通过 IntelliJ 运行应用程序时资源路径不工作,但在使用 JLink 构建它后工作

问题描述

设置:

我正在使用官方 OpenJFX 文档中的Modular with Gradle选项。

文件结构:

文件结构

正如这里所建议的,我尝试将它用于我的所有资源:

URL cssURL = getClass().getResource("/org/jamesd/examples/css/style.css"); scene.getStylesheets().add(cssURL.toExternalForm());

因此,就我而言,为了加载我的主.fxml文件(和所有资源),它将是:

URL urlFXML = getClass().getResource("/fxml/file.fxml");
Parent root = FXMLLoader.load(urlFXML);

问题:

当我单击Run -> Run Main.java(代码设置如上)时,我java.lang.NullPointerException: Location is required.得到臭名昭著的.jlink

正如本主题中所建议的,我使用了该jimage list modules命令,它给了我以下结构:

Module: [module]
    META-INF/MANIFEST.MF
    [com]/[company]/[package]/Main.class
    [com]/[company]/[package]/controllers/[Controller].class
    fxml/file.fxml
    img/logo.png
    module-info.class
    style/style.css

为了让我能够运行应用程序而无需每次都构建它,我必须URL像这样设置我的资源:

URL urlFXML = new File("src/main/resources/fxml/file.fxml").toURI().toURL();
Parent root = FXMLLoader.load(urlFXML);

但是,如果我这样做,在使用 构建我的应用程序之后jlink,我会收到以下错误:

java.io.FileNotFoundException: /home/[user]/Documents/Projects/[folder]/[folder]/[folder]/[projectname]/build/image/bin/src/main/resources/fxml/file.fxml (No such file or directory)

jimage list modules从上面的命令可以看出,这是有道理的。

我不知道是什么在困扰我,是 IDE、Gradlejlink还是我的无能。

我还确保我已经涵盖了“疑难解答”部分(来自第二个链接):

请记住,绝对路径是相对于类路径定义的。通常,类路径的根目录是 IDE 中所有源文件夹和资源文件夹的联合。

我不确定作者的意思是:

File file = new File(".");

System.out.print("Files: \n");

for(String fileNames : file.list()) System.out.println(fileNames);

返回:

Files: 
gradle
settings.gradle
.idea
src
build
build.gradle
gradlew.bat
gradlew
.gradle

我还尝试将以下代码添加到我的build.gradle文件中,但它似乎没有做任何事情:

sourceSets {
    main {
        resources {
            srcDirs = ["src/main/resources"]
            includes = ["**/*.fxml"]
        }
    }
}

问题:

有没有办法设置URL在我运行应用程序和构建它同时保持当前文件结构时适用的资源?

源/演示(GitHub 不允许我上传它 - 压缩时太大或文件/文件夹太多 - 很抱歉给您带来不便)。

我已经包含了一个jlink只需要运行的构建图像。如果您想使用绝对路径对其进行测试,请取消注释URLs 中的 s Main.java

编辑1:

文件夹的目录树build

.
├── classes
│   └── java
│       └── main
│           ├── com
│           │   └── company
│           │       └── app
│           │           ├── controllers
│           │           │   └── TestingController.class
│           │           └── Main.class
│           └── module-info.class
├── generated
│   └── sources
│       ├── annotationProcessor
│       │   └── java
│       │       └── main
│       └── headers
│           └── java
│               └── main
├── image
│   ├── bin
│   │   ├── app
│   │   ├── app.bat
│   │   ├── java
│   │   ├── jrunscript
│   │   └── keytool
│   ├── conf
│   │   ├── net.properties
│   │   ├── sdp
│   │   │   └── sdp.conf.template
│   │   ├── security
│   │   │   ├── java.policy
│   │   │   ├── java.security
│   │   │   └── policy
│   │   │       ├── limited
│   │   │       │   ├── default_local.policy
│   │   │       │   ├── default_US_export.policy
│   │   │       │   └── exempt_local.policy
│   │   │       ├── README.txt
│   │   │       └── unlimited
│   │   │           ├── default_local.policy
│   │   │           └── default_US_export.policy
│   │   └── sound.properties
│   ├── include
│   │   ├── classfile_constants.h
│   │   ├── jawt.h
│   │   ├── jni.h
│   │   ├── jvmticmlr.h
│   │   ├── jvmti.h
│   │   └── linux
│   │       ├── jawt_md.h
│   │       └── jni_md.h
│   ├── legal
│   │   ├── java.base
│   │   │   ├── ADDITIONAL_LICENSE_INFO
│   │   │   ├── aes.md
│   │   │   ├── asm.md
│   │   │   ├── ASSEMBLY_EXCEPTION
│   │   │   ├── cldr.md
│   │   │   ├── c-libutl.md
│   │   │   ├── icu.md
│   │   │   ├── LICENSE
│   │   │   ├── public_suffix.md
│   │   │   └── unicode.md
│   │   ├── java.datatransfer
│   │   │   ├── ADDITIONAL_LICENSE_INFO -> ../java.base/ADDITIONAL_LICENSE_INFO
│   │   │   ├── ASSEMBLY_EXCEPTION -> ../java.base/ASSEMBLY_EXCEPTION
│   │   │   └── LICENSE -> ../java.base/LICENSE
│   │   ├── java.desktop
│   │   │   ├── ADDITIONAL_LICENSE_INFO -> ../java.base/ADDITIONAL_LICENSE_INFO
│   │   │   ├── ASSEMBLY_EXCEPTION -> ../java.base/ASSEMBLY_EXCEPTION
│   │   │   ├── colorimaging.md
│   │   │   ├── giflib.md
│   │   │   ├── harfbuzz.md
│   │   │   ├── jpeg.md
│   │   │   ├── lcms.md
│   │   │   ├── libpng.md
│   │   │   ├── LICENSE -> ../java.base/LICENSE
│   │   │   ├── mesa3d.md
│   │   │   └── xwd.md
│   │   ├── java.prefs
│   │   │   ├── ADDITIONAL_LICENSE_INFO -> ../java.base/ADDITIONAL_LICENSE_INFO
│   │   │   ├── ASSEMBLY_EXCEPTION -> ../java.base/ASSEMBLY_EXCEPTION
│   │   │   └── LICENSE -> ../java.base/LICENSE
│   │   ├── java.scripting
│   │   │   ├── ADDITIONAL_LICENSE_INFO -> ../java.base/ADDITIONAL_LICENSE_INFO
│   │   │   ├── ASSEMBLY_EXCEPTION -> ../java.base/ASSEMBLY_EXCEPTION
│   │   │   └── LICENSE -> ../java.base/LICENSE
│   │   ├── java.xml
│   │   │   ├── ADDITIONAL_LICENSE_INFO -> ../java.base/ADDITIONAL_LICENSE_INFO
│   │   │   ├── ASSEMBLY_EXCEPTION -> ../java.base/ASSEMBLY_EXCEPTION
│   │   │   ├── bcel.md
│   │   │   ├── dom.md
│   │   │   ├── jcup.md
│   │   │   ├── LICENSE -> ../java.base/LICENSE
│   │   │   ├── xalan.md
│   │   │   └── xerces.md
│   │   └── jdk.unsupported
│   │       ├── ADDITIONAL_LICENSE_INFO -> ../java.base/ADDITIONAL_LICENSE_INFO
│   │       ├── ASSEMBLY_EXCEPTION -> ../java.base/ASSEMBLY_EXCEPTION
│   │       └── LICENSE -> ../java.base/LICENSE
│   ├── lib
│   │   ├── classlist
│   │   ├── jexec
│   │   ├── jrt-fs.jar
│   │   ├── jspawnhelper
│   │   ├── jvm.cfg
│   │   ├── libawt_headless.so
│   │   ├── libawt.so
│   │   ├── libawt_xawt.so
│   │   ├── libfontmanager.so
│   │   ├── libjavajpeg.so
│   │   ├── libjava.so
│   │   ├── libjawt.so
│   │   ├── libjimage.so
│   │   ├── libjli.so
│   │   ├── libjsig.so
│   │   ├── libjsound.so
│   │   ├── liblcms.so
│   │   ├── libmlib_image.so
│   │   ├── libnet.so
│   │   ├── libnio.so
│   │   ├── libprefs.so
│   │   ├── libsplashscreen.so
│   │   ├── libverify.so
│   │   ├── libzip.so
│   │   ├── modules
│   │   ├── psfontj2d.properties
│   │   ├── psfont.properties.ja
│   │   ├── security
│   │   │   ├── blacklisted.certs
│   │   │   ├── cacerts
│   │   │   ├── default.policy
│   │   │   └── public_suffix_list.dat
│   │   ├── server
│   │   │   ├── libjsig.so
│   │   │   └── libjvm.so
│   │   └── tzdb.dat
│   └── release
├── jlinkbase
│   ├── delegating
│   ├── jlinkjars
│   │   ├── javafx-base-11.0.2-linux.jar
│   │   ├── javafx-controls-11.0.2-linux.jar
│   │   ├── javafx-fxml-11.0.2-linux.jar
│   │   ├── javafx-graphics-11.0.2-linux.jar
│   │   ├── testing-1.0.jar
│   │   └── testing.merged.module-1.0.jar
│   ├── mergedjars
│   ├── nonmodjars
│   ├── tmpmerged
│   │   └── testing.merged.module-1.0.jar
│   └── tmpmodinfo
│       └── module-info.class
├── libs
│   └── testing-1.0.jar
├── resources
│   └── main
│       ├── fxml
│       │   └── file.fxml
│       ├── img
│       │   └── logo.png
│       ├── lang
│       ├── lib
│       ├── META-INF
│       │   └── MANIFEST.MF
│       └── style
│           └── style.css
└── tmp
    ├── compileJava
    │   └── source-classes-mapping.txt
    └── jar
        └── MANIFEST.MF

标签: javajavafx

解决方案


推荐阅读