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

13 浏览
0 Comments

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

我试图加载位于不同包中的*.fxml文件,这些文件被打包在一个JAR中。

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

- src/main/java:

- com.test.controller

- Application.java

- com.test.view

- Main.fxml

- src/main/test: 包含单元测试

- src/main/resources: 包含图片

此处所述,我使用以下语句加载FXML文件。(没有前导斜杠“/”)该方法在Application.java文件中调用。

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

如果在eclipse中运行项目,这样运行得很好,但是如果执行由Gradle创建的JAR文件,则会出现java.lang.IllegalStateException: Location is not set的错误。

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

我尝试了几种访问不同包中FXML文件的变体,但没有一种方法起作用。有人知道在这种情况下该怎么做吗?

我宁愿不将FXML文件移动到资源文件夹中(如此处所述),因为我认为应该可以访问它们现在所在的位置。

0
0 Comments

在使用Java的FXML加载器(FXMLLoader)时,有时会遇到在JAR文件中加载FXML文件的问题。下面将介绍导致这个问题出现的原因以及解决方法。

问题的原因是由于在JAR文件中,FXML文件不是以文件系统路径存在的,而是作为资源文件存储在类路径(classpath)中。因此,直接使用常规的文件路径加载FXML文件会导致找不到文件的错误。

为了解决这个问题,可以采取以下方法:

方法一:相对于当前类文件(MyClass)的路径加载FXML文件。可以使用以下代码:

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

这将返回一个URL对象,指向FXML文件的位置。

方法二:相对于类路径根目录加载FXML文件。可以使用以下代码:

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

这将返回一个URL对象,指向FXML文件的位置,并将其转换为一个File对象。

为了使上述方法正常工作,需要对构建工具进行相应的配置。如果使用Gradle作为构建工具,可以将以下代码添加到build.gradle文件中:

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

这将告诉Gradle将资源文件夹(src/main/resources)添加到类路径中,以便在JAR文件中正确加载FXML文件。

通过以上的配置和代码,就可以正确加载JAR文件中的FXML文件了。无论是相对于当前类文件的路径还是相对于类路径根目录的路径,都可以正常找到并加载FXML文件,避免了找不到文件的错误。

0