程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了JavaFX - 资源路径在通过 IntelliJ 运行应用程序时不起作用,但在使用 JLink 构建后起作用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决JavaFX - 资源路径在通过 IntelliJ 运行应用程序时不起作用,但在使用 JLink 构建后起作用?

开发过程中遇到JavaFX - 资源路径在通过 IntelliJ 运行应用程序时不起作用,但在使用 JLink 构建后起作用的问题如何解决?下面主要结合日常开发的经验,给出你关于JavaFX - 资源路径在通过 IntelliJ 运行应用程序时不起作用,但在使用 JLink 构建后起作用的解决方法建议,希望对你解决JavaFX - 资源路径在通过 IntelliJ 运行应用程序时不起作用,但在使用 JLink 构建后起作用有所启发或帮助;

设置:

我正在使用 official OpenJFX documentation 中的 @H_581_5@modular with Gradle 选项。

文件结构:

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

正如 here 中所建议的,我尝试将其用于我的所有资源:

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 构建应用程序时,它可以工作 - 应该如此!

正如 this topic 中所建议的,我使用了 jimage List modules 命令,它给了我以下结构:

@H_736_20@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、Gradle、jlink 或我的无能。

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

  • 我为我的资源使用了有效的名称。
  • 由于我使用的是 getClass().getresource(),所以我在 / 中使用了 URL
  • 最后一点是:

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

我不确定作者的意思是:

  • 如上图所示的 src 文件夹(因为他提到了 IDE)。
  • src/main 文件夹,因为这是所有“源”代码所在的位置(即包含包和 java 文件的 .java 文件夹)。
  • “主”文件夹,其中包含构建应用程序后的所有文件夹和资源(如 jimage List modules 命令所见)。
  • 或运行此代码后获得的文件目录(在 IDE 中由 Run -> @H_581_5@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它在我运行应用程序和构建它时都适用,同时保持我当前的文件结构?

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

我已经包含了一个构建的 jlink 图像,它只需要运行。如果您想使用绝对路径对其进行测试,请取消注释 URL 中的 @H_736_20@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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的JavaFX - 资源路径在通过 IntelliJ 运行应用程序时不起作用,但在使用 JLink 构建后起作用全部内容,希望文章能够帮你解决JavaFX - 资源路径在通过 IntelliJ 运行应用程序时不起作用,但在使用 JLink 构建后起作用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:-但在使用