JavaFX-资源路径在通过IntelliJ运行应用程序时不起作用,但在使用JLink构建应用程序后起作用 设置:
我使用的是来自的带有Gradle的模块化选项 文件结构: 正如中所建议的,我尝试将此用于我的所有资源:JavaFX-资源路径在通过IntelliJ运行应用程序时不起作用,但在使用JLink构建应用程序后起作用 设置:,java,javafx,Java,Javafx,我使用的是来自的带有Gradle的模块化选项 文件结构: 正如中所建议的,我尝试将此用于我的所有资源: URL cssURL=getClass().getResource(“/org/jamesd/examples/css/style.css”) scene.getStylesheets().add(cssURL.toExternalForm()) 因此,在我的例子中,为了加载我的主.fxml文件(以及所有资源),它将是: URL urlFXML = getClass().getResourc
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:位置是必需的。
,但是当我使用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
s设置为:
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,Gradle,jlink
还是我的无能
我还确保我已经涵盖了“故障排除”部分(从第二个链接开始):
- 我正在为我的资源使用有效的名称
- 因为我使用的是
getClass().getResource()
,所以我在URL
中使用的是/
- 最后一点是:
请记住,绝对路径是相对于类路径定义的。
通常,类路径的根是所有源和
IDE中的资源文件夹
我不确定作者的意思是:
- 上图所示的
src
文件夹(因为他提到了IDE)
src/main
文件夹,因为这是所有“源”代码所在的位置(即带有包和.java
文件的java
文件夹)
- “主”文件夹,它包含应用程序构建后的所有文件夹和资源(如
jimage list modules
命令所示)
- 或者运行此代码后获得的文件目录(由IDE中的Run->Main.java运行,而不是在构建应用程序后运行):
文件文件=新文件(“.”)代码>
System.out.print(“文件:\n”)代码>
for(字符串文件名:file.list())System.out.println(文件名)代码>
返回:
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
s,它在运行应用程序和构建应用程序时都适用,同时维护当前的文件结构
(GitHub不允许我上传-压缩时太大或文件/文件夹太多-很抱歉给您带来不便)
我已经包括了一个内置的jlink
映像,它只需要运行。如果要使用绝对路径对其进行测试,请取消对Main.java
中的URL
s的注释
编辑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
在IDE中运行时,您是否在没有第一个/?的情况下尝试过getClass().getResource(“fxml/file.fxml”),它是从文件系统运行还是从jar文件运行?根据需要检查构建文件夹或jar文件的内容,并确保资源正确部署。@Tokazio我确实尝试过,但实际上并不正确,因为没有/
它正在寻找fxml
文件夹,其中包含Main.java
@詹姆斯:是的,它是从系统中运行的。我还尝试了同步(文件->从磁盘读取全部选项)和使chaces+重新启动无效,恐怕没有帮助。如果您的资源在好的文件夹中,请检查INTELij的build文件夹或out文件夹。使用gradle,您可以手动处理这些文件的存放位置……从IntelliJ执行时不要说“Run Main.java”。让IntelliJ执行由应用程序
插件添加的Gradle运行
任务。确保您已配置该插件,以便Gradle知道哪个模块是您的主模块,哪个类是您的主类。