JavaFX-资源路径在通过IntelliJ运行应用程序时不起作用,但在使用JLink构建应用程序后起作用 设置:

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

我使用的是来自的带有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:位置是必需的。
但是当我使用
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知道哪个模块是您的主模块,哪个类是您的主类。