【问题标题】:Can't load resource, always returns null无法加载资源,总是返回 null
【发布时间】:2016-03-10 10:50:48
【问题描述】:

我有以下问题:

我正在开发一个带有 IntelliJ IDEA 15 的 Java 8 应用程序,使用 JavaFX 作为 GUI,Gradle 作为构建自动化系统(虽然之前从未使用过 Gradle)。加载fxml文件时总是得到IllegalStateException“Location is not set”,原因是getClass().getResource("gui.fxml")总是返回null

我的 Java 代码:

package minerva.gui;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        System.out.println(getClass().getResource("gui.fxml")==null); // DEBUG: always returns true, but why?

        FXMLLoader loader = new FXMLLoader(getClass().getResource("gui.fxml"));
        Parent root = (Parent) loader.load();
        primaryStage.setTitle("Minerva");
        primaryStage.setScene(new Scene(root));
        Controller control = loader.getController();
        primaryStage.show();
    }
}

也许 Gradle 对此负责,我不知道。

build.gradle:

group 'minerva.impl'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.5

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.hsqldb:hsqldb:2.3.1'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

settings.gradle:

rootProject.name = 'minerva'

我还检查了 IntelliJ 设置中的资源模式,它们应该是有效的:!?.java;!?.form;!?.class;!?.groovy;!?.scala;!?.flex;!?.kt;!?.clj;!?*.aj

这也是我的结构的图像:

【问题讨论】:

  • 试试斜杠 getResource("/gui.fxml")
  • @AdamSkywalker 将其更改为 getResource("/gui.fxml") 并将其移至资源文件夹即可解决问题,谢谢
  • 有人用 java 11 试过这个吗?它总是为我返回 null

标签: java intellij-idea gradle java-8 illegalstateexception


【解决方案1】:

Gradle 具有与 maven 类似的项目结构,并且将源和资源分开。 资源应该放到src/main/resources

将您的gui.fxml 文件移动到resource 文件夹中,应该可以找到它。

您生成的工件放置在 $PROJECT/target 中,如果您将来遇到类似问题,最好查看您的 jar,war,ear 或任何存档,以便查看文件是否打包为预期的。

【讨论】:

  • 就像我在上面写给@AdamSkywalker 的那样:将文件移动到资源文件夹并将 getResource("gui.fxml") 更改为 getResource("/gui.fxml") 可以解决问题。我还发现通过将sourceSets {main { resources { srcDirs = ["src/main/java"] includes = ["**/*.fxml"]}}} 添加到build.gradle 也是一种可能的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
相关资源
最近更新 更多