使用loader.setLocation(getClass()。getClassLoader())在JAR中加载FXML

时间:2017-10-03 19:17:12

标签: jar classpath fxml

我正在尝试加载我的* .fxml文件,这些文件位于不同的包中,打包在JAR中。

我的文件夹结构:(所有文件夹都在类路径中)

- src/main/java: 
    - com.test.controller
        - Application.java
    - com.test.view
        - Main.fxml
- src/main/test: contains unit tests
- src/main/resources: contains images

如上所述Symfony Documentation我使用以下语句加载FXML文件。 (没有前导斜杠" /")该方法在Application.java文件中调用。

FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("com/test/Main.fxml")

如果我在eclipse中运行项目,这很好用,但如果我执行JAR(使用Gradle创建),则会失败java.lang.IllegalStateException: Location is not set

如果我解压缩JAR文件,我可以看到Main.fxml下的/com/test/,因此该文件确实存在。

我尝试了在不同包中访问FXML文件的几种变体,但没有任何效果。有人知道该怎么做吗?

我宁愿不将FXML文件移动到资源文件夹(如陈述here,因为我认为应该可以访问它们现在的文件。

1 个答案:

答案 0 :(得分:0)

将此添加到build.gradle(如果使用Gradle作为构建工具)

sourceSets {
    main {
        resources {
            srcDirs = ["src/main/java", "src/main/resources"]
        }
    }
}

然后按以下方式加载资源:

选项1:相对于当前的类文件(MyClass):

MyClass.class.getResource("../view/Main.fxml")

选项2:相对于类路径根

URL configUrl = MyClass.class.getClassLoader().getResource("config.xml");
File myConfigFile = new File(configUrl.toURI());`