当 module-info.java 文件存在时,无法访问 JavaFX 16 中的资源文件

2024-03-02

我刚刚开始使用 Java 16,似乎不明白为什么我无法访问资源文件。我进行了一些故障排除,至少缩小了我似乎遇到问题的范围。

我正在使用 IntelliJ IDEA 2021.2 内部版本 #IU-212.4746.92

我创建了一个新项目,并选择了 JavaFX 和 OpenJDK 16。

然后,它创建包含三个主文件的项目:一个应用程序类、一个控制器类和一个 FXML 文件。创建项目后,我进入 POM 文件,选择 javaFX-controls 和 javafx-fxml 的版本 16,然后告诉它获取自动添加到 POM 文件中的其他库的最新版本。

我还将不同项目中的两个文件夹复制到资源文件夹中 - 所有复制和粘贴都是在 IntelliJ 中完成的。

当我运行它放在那里的应用程序(称为 HellpApplication)时,它工作正常。该应用程序使用 class.getResource 来获取 fxml 文件,然后......它工作得很好。但是,当我尝试运行此类时:

import java.io.*;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.List;

public class FileResourcesUtils {

    public static void main(String[] args) throws URISyntaxException {
        FileResourcesUtils app = new FileResourcesUtils();
        String fileName = "StyleSheets/AnchorPane.css";
        System.out.println("getResourceAsStream : " + fileName);
        InputStream is = app.getFileFromResourceAsStream(fileName);
        printInputStream(is);
        System.out.println("\ngetResource : " + fileName);
        File file = app.getFileFromResource(fileName);
        printFile(file);
    }

    private InputStream getFileFromResourceAsStream(String fileName) {
        ClassLoader classLoader = getClass().getClassLoader();
        InputStream inputStream = classLoader.getResourceAsStream(fileName);
        if (inputStream == null) {
            throw new IllegalArgumentException("file not found! " + fileName);
        }
        else return inputStream;
    }

    private File getFileFromResource(String fileName) throws URISyntaxException{

        ClassLoader classLoader = getClass().getClassLoader();
        URL resource = classLoader.getResource(fileName);
        if (resource == null) {
            throw new IllegalArgumentException("file not found! " + fileName);
        }
        else return new File(resource.toURI());}

    private static void printInputStream(InputStream is) {
        try (InputStreamReader streamReader =
                     new InputStreamReader(is, StandardCharsets.UTF_8);
                     BufferedReader reader = new BufferedReader(streamReader)
        ) 
        {
            String line;
            while ((line = reader.readLine()) != null) System.out.println(line);
        } 
        catch (IOException e) {e.printStackTrace();}
    }

    private static void printFile(File file) {
        List<String> lines;
        try {
            lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
            lines.forEach(System.out::println);
        }
        catch (IOException e) {e.printStackTrace();}
    }

}

它抛出这个错误:

getResourceAsStream : StyleSheets/AnchorPane.css
Exception in thread "main" java.lang.IllegalArgumentException: file not found! StyleSheets/AnchorPane.css
    at com.simtechdata.test/com.simtechdata.test.FileResourcesUtils.getFileFromResourceAsStream(FileResourcesUtils.java:27)
    at com.simtechdata.test/com.simtechdata.test.FileResourcesUtils.main(FileResourcesUtils.java:16)

然后,我唯一要做的就是删除 module-info.java,然后该类就可以完美运行!但是,如果没有 module-info.java,我无法运行任何 FX 代码...

这是 module-info.java:

module com.simtechdata.test {
    requires javafx.controls;
    requires javafx.fxml;


    opens com.simtechdata.test to javafx.fxml;
    exports com.simtechdata.test;
}

我为什么使用这个类?因为我在尝试访问 JavaFX 应用程序中的资源文件时遇到了完全相同的问题,而此类是我演示该问题并表明它专门连接到模块信息文件的最简单方法。当我运行自己的 JavaFX 代码时,它工作得很好,直到我尝试访问资源文件(例如样式表)以将其扔到控件上。

我想知道的是......我需要做什么才能从我的 JavaFX 16 应用程序访问资源文件?我缺少什么?

我已经尝试了所有这些不同的方法来获取资源文件,但每种方法都会给出相同的错误:

String CSS_ANCHOR_PANE = this.getClass().getResource("StyleSheets/AnchorPane.css").toExternalForm();
String CSS_ANCHOR_PANE = ClassName.getClass().getResource("StyleSheets/AnchorPane.css").toExternalForm();

ClassLoader resource = ClassLoader.getSystemClassLoader();
String CSS_ANCHOR_PANE = resource.getResource("StyleSheets/AnchorPane.css").toExternalForm();

Class<?> resource = this.getClass();
String CSS_ANCHOR_PANE = resource.getResource("StyleSheets/AnchorPane.css").toExternalForm();

这是资源文件夹树的屏幕截图:

有任何想法吗?


StackOverflow 网站上的许多其他地方确实回答了这个问题,但我将在这里汇总各种解决方案。

您基本上有三个选择:

  1. Use the getResource() (or getResourceAsStream(),尽管前者稍微好一点)中定义的方法Class,而不是在ClassLoader与正确的路径。这避免了任何模块化问题。
  2. 使项目非模块化(即不定义module-info.java文件)并指定要作为运行时参数添加到 JVM 的模块。这允许您使用ClassLoader's getResource() or Class's getResource() method.
  3. 创建模块化项目并使用ClassLoader's getResouce()方法,无条件打开包含该资源的包。

Solution 1 is detailed here https://stackoverflow.com/questions/61531317/how-do-i-determine-the-correct-path-for-fxml-files-css-files-images-and-other. Since the style sheet you are loading is in the StyleSheets package1, and the class you are loading it from appears (from the stack trace) to be in an unrelated package com.simtechdata.test, you should provide an absolute path:

String CSS_ANCHOR_PANE = this.getClass().getResource("/StyleSheets/AnchorPane.css").toExternalForm();

对于解决方案 2,使用

String CSS_ANCHOR_PANE = this.getClass().getClassLoader().getResource("StyleSheets/AnchorPane.css").toExternalForm();

去除module-info.java文件,并使用 JVM 参数运行应用程序

--module-path="/path/to/javafx/modules" --add-modules="javafx.controls,javafx.fxml"

(代替/path/to/javafx/modules与 JavaFX 模块的实际文件系统路径。这javafx.fxml模块仅在add-modules参数(如果您使用的是 FXML)。


对于解决方案 3,使用

String CSS_ANCHOR_PANE = this.getClass().getClassLoader().getResource("StyleSheets/AnchorPane.css").toExternalForm();

Since your resource is in the StyleSheets package1 you need to open that package unconditionally. Add the line

opens StyleSheets ;

to your module-info.java文件。看https://stackoverflow.com/a/48790851/2189127 https://stackoverflow.com/a/48790851/2189127


(1) 强烈建议遵循标准命名约定;我什至不确定解决方案 3 是否适用于非标准包名称(包名称应全部小写)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 module-info.java 文件存在时,无法访问 JavaFX 16 中的资源文件 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • Datagridview 更改非空单元格的单元格颜色

    我正在创建一个日历约会应用程序 我想在加载 打开应用程序时更改非空单元格 具有值的单元格 的 datagridview 的颜色 我的应用程序已经处理如何加载数据 我可以更改非空单元格的颜色 但关闭并再次打开后 颜色又恢复为默认值 我不确定语
  • X-Editable 在成功更新后将“空”

    我正在使用 X Editable 插件在表格上进行内联编辑 但遇到了一个恼人的问题 请求成功并更新成功后 插件会在表格单元格上放置 空 而不是正确的更新值 我的网站很安静 所以我正在对 URL 执行 PUT 请求 例如http exampl
  • 如何在 Eclipse Kepler 中添加 Web Tools Platform(WTP)

    我安装了Eclipse Kepler在我的系统中 到目前为止我开发了J2SE应用 现在我想发展J2EE应用程序 所以我需要添加WTP在我的日食中 我尝试添加WTP在已经存在的 eclipse 中 为此 我通过以下方式打开安装对话框并提及Na
  • 如何在 Eclipse 中注释块?

    Eclipse 有评论块的热键吗 并取消注释块 Ctrl to toggle comments and Ctrl Shift to toggle comments At least for Java anyway other tooling
  • 为什么set_xticks不设置刻度的标签?

    import matplotlib pyplot as plt x range 1 7 y 220 300 300 290 320 315 def test axes axes bar x y axes set xticks x i 100
  • 使用 DX Compositor 的 UWP 应用程序实时模糊背景

    因此 UWP 合成支持已经有一段时间了 我正在寻找一种对元素进行实时模糊的方法 在移动或加载时进行实时模糊 而不是静态快照 到目前为止 我一直在 stackoverflow 和 google 上查看一些答案 这导致我使用Lumia 成像 S
  • Android Admob 插页式内存泄漏

    我试图在某些活动结束时显示插页式广告 问题是插页式广告似乎阻止了活动被垃圾收集 从而导致内存不足异常 我该如何解决这个问题 提前致谢 public class AdActivity extends FragmentActivity prot
  • 如何更改日期格式

    我需要将日期格式更改为 dd mm YYYY HH mm ss 目前我得到的是 YYY mm dd HH mm ss 任何人都可以帮我解决这个问题吗 for var course in data if data course days va
  • WCF服务自定义配置

    在托管多个 WCF 服务的应用程序中 为每个服务添加自定义配置信息的最佳方法是什么 例如 您可能想要传递或设置公司名称或指定服务或某些其他参数的连接字符串 我猜想通过实现 IServiceBehavior 这可能是可能的 即类似
  • 创建一个 html 表格,动态扩展列数以适应屏幕尺寸

    我有很长的数据列表 例如 国家及其缩写 我想在 HTML 表中显示 我不想在 2 x 50 表中显示数据 而是希望它在更大的屏幕上更紧凑 这样用户就不必上下滚动 但仍然不必水平滚动 所以这会动态增长 State Ab Alabama AL
  • 试图理解sql查询中的“除了所有”

    我看到这个例子 但我不明白它的意思 SELECT drinker FROM Frequents EXCEPT ALL SELECT drinker FROM Likes 关系 经常 饮酒者 酒吧 喜欢 饮酒者 啤酒 在这种情况下 ALL 会
  • 纯 CSS 中旋转图像背后的纯色背景

    有没有办法可以使用纯 CSS 绘制图像后面的黑色 背景 我确信可以使用 before伪类 但我无法让它发挥作用 我也尝试过使用阴影 但最终结果与我想要达到的效果并不相似 范围及要求 现代浏览器 没有 javascript 没有 jQuery
  • CSS-目标文本链接在悬停时具有底部边框,但图像链接没有边框

    我希望能够在鼠标悬停时使用 border bottom 来定位 CSS 中的文本链接 但所有图像链接在悬停时都没有边框 所以 a href img src image png a gt this should not have a bott
  • 使用 PyYAML 库解析 AWS CloudFormation 模板

    我正在使用 PyYAML 库编写一个自定义 Python 应用程序 该应用程序需要读取 AWS CloudFormation YAML 模板 我知道这些模板是有效的 CloudFormation 模板 因为我使用 validate temp
  • Lego Mindstorm NXT 2.0:“错误:NXT 蓝牙密钥确认失败”

    运行 Windows 7 和 Lego Mindstorms NXT 2 0 IDE Windows 蓝牙管理器显示 NXT 已连接 并且 NXT 显示在 Windows 蓝牙设备列表中 然而 当我尝试从 Lego IDE 进行连接时 我收
  • 通过基类专门化类模板

    我将我的疑问提炼为以下代码 struct base struct derived public base template
  • 如何编写Thunderbird扩展(webextension)来修改消息显示?

    我想为 Thunderbird 编写一个扩展来修改消息显示 例如插入 替换文本 标记 图像 不幸的是 缺少文档 由于最近的更改 https developer mozilla org en US docs Mozilla Thunderbi
  • 我们如何获取 Android 的设备令牌以进行推送通知?

    我想在我的应用程序中实现推送通知 我想知道 启用谷歌云消息传递API后 我们如何在android中获取推送通知的设备令牌 我们如何获取特定设备的设备令牌 try InstanceID instanceID InstanceID getIns
  • 单一型号的 Carrierwave 多个上传器

    我在本教程的帮助下创建了一个画廊模块https kolosek com rierwave upload multiple images https kolosek com carrierwave upload multiple images
  • 当 module-info.java 文件存在时,无法访问 JavaFX 16 中的资源文件

    我刚刚开始使用 Java 16 似乎不明白为什么我无法访问资源文件 我进行了一些故障排除 至少缩小了我似乎遇到问题的范围 我正在使用 IntelliJ IDEA 2021 2 内部版本 IU 212 4746 92 我创建了一个新项目 并选