IntelliJ IDEA - getClass().getResource("...") 返回 null

Posted

技术标签:

【中文标题】IntelliJ IDEA - getClass().getResource("...") 返回 null【英文标题】:IntelliJ IDEA - getClass().getResource("...") return null 【发布时间】:2014-12-07 07:30:12 【问题描述】:

我使用的是 IntelliJ IDEA 13.1.5,我曾经使用 Eclipse。我正在开发 JavaFX 应用程序,我尝试使用 getClass().getResource() 在我的 MainApp 类中加载 FXML 文件。 我阅读了文档并尝试了几个想法,最后我有 null

这是层次结构:

dz.bilaldjago.homekode.MainApp.java

dz.bilaldjago.homekode.view.RootLayout.FXML

这是我使用的代码sn-p:

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/RootLayout.fxml"));

我尝试了其他解决方案,例如从根目录提供 url 并使用 classLoader

结果是一样的。有什么建议

【问题讨论】:

Java - class.getResource returns null的可能重复 【参考方案1】:

我通过在 IDEA 上指出resource root 解决了这个问题。

Right click 在目录(或只是项目名称)上 -> Mark directory As -> Resource Root

重新编译并高兴 :P 希望这对你有用~

【讨论】:

对我不起作用,我更改了编译器资源模式。将资源文件夹作为我项目的根文件夹,然后作为我的班级所在的工作文件夹,但仍然无法正常工作!请帮忙。我正在使用 intellij @AVERAGE 嗨,我不认为这会是一个问题。您是否尝试过重新创建项目并重做操作?如果还是不行,请贴出您的详细操作步骤。这将有助于解决您的问题。 对我来说,如果它是“src/main”路径旁边的“src/resources”,它会起作用,但如果在“resources”路径中则为空 我的示例程序开始工作,并且出现了示例“HELLO”窗口,但即使现在错误仍然存​​在 ie->"Argument 'getClass().getResource("sample.fxml")'可能为空”【参考方案2】:

对于使用 Intellij Idea 的用户:查看Settings -> Compiler -> Resource patterns

该设置包含应被解释为资源的所有扩展。如果扩展不符合此处的任何模式,class.getResource 将为使用此扩展的资源返回 null。

【讨论】:

我使用这种模式添加 fxml 文件 ?*.fxml 但结果是一样的! 为什么是 "?*.fxml" 而不是 "*.fxml" 或 "view:*" - 目录视图中的所有文件和文件夹。见:jetbrains.com/idea/webhelp/compiler.html#pattern 我遵循资源字段中存在的相同模式 它没有做任何改变! @BilalDja 你设法解决了这个问题吗?因为我现在遇到同样的问题【参考方案3】:

TL;博士;

    把你的资源放到resources文件夹中。

    在名字前加一个斜杠:getClass().getResource("/myfont.ttf");

长篇大论;

如果你使用Intellij IDEA并且你创建了一个Maven项目,你应该把你的资源放在resources文件夹中(被intellij自己标记为资源根目录)并且这些资源去你编译的应用程序的根目录.

我的意思是,/resources/myfont.ttf 将在生成的构建中转到 /myfont.ttf

所以你应该通过/myfont.ttf 而不是myfont.ttf 获得它。像这样使用它:

getClass().getResource("/myfont.ttf");

无需更改任何其他内容。就这一个帮助了我。

【讨论】:

【参考方案4】:

如果您的项目是 maven 项目,请检查目标代码以查看您的 .fxml 文件是否存在。如果它不存在,只需添加

<resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>

在你的 pom.xml 中

【讨论】:

除了上面提到的方法之外,如果使用Maven,这是一个关键点。永远不要忘记加载 pom.xml 文件并将资源节点写入构建节点。 也适用于 Kotlin。【参考方案5】:

首先,您需要为 IntelliJ 设置 srcresource 文件夹。

查看 java(蓝色)和资源(黄色 4 行)文件夹附近的图标。

右键单击 java 文件夹并选择 sources root

然后右键单击 java 文件夹并选择 resource root

之后在 java 文件夹和资源文件夹中创建相同的包。

例如:包 -> org.example

├─ src
   ├─ main
       ├─ java
       |  └─ com
       |      └─ example
       |           └─ A.class
       |
       └─ resources  
          └─ com
              └─ example
                    └─ fxml
                         └─ AFXML.fxml

在 A.class 你可以使用这个。

Java

 FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/AFXML.fxml"));
 Parent root = loader.load();

科特林

 val loader = FXMLLoader(javaClass.getResource("fxml/AFXML.fxml"))
 val root = loader.load<Parent>()

 val loader = FXMLLoader(A::class.java.getResource("fxml/AFXML.fxml"))
 val root = loader.load<Parent>()

【讨论】:

【参考方案6】:

如果您的项目是 Gradle,请检查 Settings -> Build, Execution, Deployment -> Gradle -> Build and run 部分。 确保"Build and run using" 选项为"Gradle"

Intellij IDEA 的编译器不会复制“资源”来构建目录或测试类路径。 此外,它意外地使用了虚拟的“out”目录而不是“build”。

更新:只有 1 个选项“构建并运行使用”足以设置为 Gradle。

【讨论】:

【参考方案7】:

根据建议,更新答案。

第一步

    右键项目 点击将目录标记为 点击源根目录

第二步

    单击菜单栏中的文件 点击项目结构...打开设置面板

第三步

    单击“模块”选项卡 如您所见,没有添加任何资源文件夹作为内容根目录 我们需要在其中添加资源文件夹

第四步

    确保点击资源文件夹 之后点击资源标签 您将在右侧面板中看到资源文件夹添加为资源文件夹

重新运行你的 java 程序,现在它应该可以工作了。

Fixed similar issue today by adding resources folder into Resource Tab in IntelliJ IDE

希望这会有所帮助。另外,details tutorial。

【讨论】:

感谢您的回答,我无法证明这是否是正确的答案;)链接图像在 *** 上并不是一种常见的行为。你能描述一下你做了什么吗?也许在列表样式中:1.)单击此处 2.)按按钮或箭头样式“ressources->edit” 感谢@nologin 的建议-我是stackoverflwo 社区的新手。更新了答案。【参考方案8】:

Project Structure > Project 中,您必须确保Project compiler output: 的值已填写。在我的情况下,它没有。将其指向项目中的./target./bin(无论你有什么)目录。

【讨论】:

【参考方案9】:

非常令人沮丧。还会发生的情况是,包含资源的目录有时会创建为:

 └── resources
     └── my.tests             
           ├── t1.txt
           └── t2.txt

代替:

 └── resources
     └── my
          └── tests
              ├── t1.txt
              └── t2.txt

解决方案是手动重新创建目录结构,使其类似于第二个示例。

如果您使用 maven 来消除这成为 IDE 问题的可能性,我还建议您在命令行上对测试进行故障排除(使用 mvn clean test)。

【讨论】:

【参考方案10】:

我使用下面的代码从 spring 应用程序的资源文件夹中访问文件。 我使用了 classLoader.getResourceAsStream(FileName) 而不是 getClass().getResourceAsStream(FileName),希望这将有助于访问 位于资源文件夹中的文件。

String fileName = "./file.txt";
ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(fileName);

I resolved file access so thought to share with all .

【讨论】:

【参考方案11】:

使用这个语法:

("../view/RootLayout.fxml"))

【讨论】:

【参考方案12】:

Windows 区分大小写,而其他地方则不。也是一个可执行的 java jar(zip 格式),资源名称区分大小写。

最好重命名文件

view/RootLayout.FXML

view/RootLayout.fxml

这必须通过移走原始文件并创建一个新文件来完成。

同时编译成 jar,并检查 fxml 文件是否已添加到 jar(zip 文件)中。如果不是 IntelliJ 资源路径由其他答案处理。

顺便说一下,这是相对于getClass() 的包路径的路径。请注意,如果您扩展了此类,则完整路径会发生变化,请更好地使用:

MainApp.class.getResource("view/RootLayout.fxml")

【讨论】:

【参考方案13】:

我放弃了尝试使用 getClass().getResource("BookingForm.css"));

我创建一个 File 对象,从该对象创建一个 URL,然后将其传递给 getStyleSheets() 或 setLocation() File file = new File(System.getProperty("user.dir").toString() + "/src/main/resources/BookingForm.css");

scene.getStylesheets().add(folder.toURI().toURL().toExternalForm());

【讨论】:

以上是关于IntelliJ IDEA - getClass().getResource("...") 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

intellij idea怎么更改字体大小

intellij idea 怎么编译erlang

intellij idea 14.1.5 怎么弄中文

请教intellij idea 14安装jrebel破解方法

macOS&&IntelliJ IDEA-IntelliJ IDEA介绍以及IntelliJ IDEA 2019.3新特性

intellij idea svn怎么比较