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 设置 src 和 resource 文件夹。
查看 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 14安装jrebel破解方法
macOS&&IntelliJ IDEA-IntelliJ IDEA介绍以及IntelliJ IDEA 2019.3新特性