java - 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
还是我的无能。
我还确保我已经涵盖了“疑难解答”部分(来自第二个链接):
- 我正在为我的资源使用有效名称。
- 由于我正在使用
getClass().getResource()
,我正在使用/
我的URL
. - 在最后一点,即:
请记住,绝对路径是相对于类路径定义的。通常,类路径的根目录是 IDE 中所有源文件夹和资源文件夹的联合。
我不确定作者的意思是:
src
如上图所示的文件夹(因为他提到了 IDE)。- 该
src/main
文件夹是所有“源”代码所在的java
文件夹(即包含包和.java
文件的文件夹)。 - 构建应用程序后包含所有文件夹和资源的“主”文件夹(如
jimage list modules
命令所示)。 - 或运行此代码后获得的文件目录(由 IDE 中的Run -> Main.java运行,而不是在构建应用程序后):
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
只需要运行的构建图像。如果您想使用绝对路径对其进行测试,请取消注释URL
s 中的 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
解决方案
推荐阅读
- python - Kivy + Python + Raspberry - 如何实现倒计时
- sql - 使用连接创建视图
- java - Java Rest web 服务中缺少子对象
- python-3.x - 尝试从 python 列表中附加并打印已删除的项目
- oracle - 我在这个过程中做错了什么
- android - android - 无法获取gps坐标
- sorting - 如何使用 sort 命令根据 unix 中的最后一列对文件进行排序?
- reactjs - API 请求返回页面标记
- javascript - 通过使用 JS 单击另一个按钮类型输入将值从输入复制到剪贴板
- kubernetes - Kubernetes健康检查工作进入谷歌云平台