如何告诉Java JAR文件中的正确文件路径?
我已将所有JavaFX代码放入一个可执行JAR文件中。一切都在里面 当我用EclipseIDE编译它时,它可以工作,但是当我尝试执行JAR文件时,我得到了一个错误如何告诉Java JAR文件中的正确文件路径?,java,javafx,java-11,openjfx,Java,Javafx,Java 11,Openjfx,我已将所有JavaFX代码放入一个可执行JAR文件中。一切都在里面 当我用EclipseIDE编译它时,它可以工作,但是当我尝试执行JAR文件时,我得到了一个错误 Caused by: javafx.fxml.LoadException: file:/home/asus/program/JUSBPlotter/JUSBPlotter-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/se/danielmartensson/fxml/front.fxml 当我
Caused by: javafx.fxml.LoadException:
file:/home/asus/program/JUSBPlotter/JUSBPlotter-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/se/danielmartensson/fxml/front.fxml
当我有这个Java代码时
Parent root = FXMLLoader.load(getClass().getResource("/se/danielmartensson/fxml/front.fxml"));
FXML文件没有问题
fx:controller="se.danielmartensson.controller.Front"
当我试图在JavaFX中显示图片时,也会出现错误
Caused by: java.io.FileNotFoundException: file:/home/asus/program/JUSBPlotter/JUSBPlotter-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/se/danielmartensson/pictures/computer.png (No such file or directory)
当我有这个Java代码时:
FileInputStream picture1 = new FileInputStream(getClass().getResource("/se/danielmartensson/pictures/computer.png").getFile());
问题:
如何在JAR文件中告诉Java正确的文件路径?需要记住的一点是,资源与文件不是一回事,尽管它们看起来非常相似,尤其是在打包应用程序之前。一旦您打包了一个应用程序,这些资源文件就变成了JAR文件中的条目,虽然它们可以被认为是文件,但不能以与文件相同的方式进行访问。特别是,
java.io.File
API不理解如何读取这些条目。但是,您可以通过返回的URL
或返回的InputStream
访问这些条目。注意,后者基本上只查找URL
,如果存在,则调用URL\openStream()
。您可以使用URL
访问JAR条目(即资源)的原因是由于和相关的类;我不会详细介绍Java如何处理URL,因为这超出了这个答案的范围
现在,由于您试图在JavaFX中显示图像,我假设您正在使用该类。基本上有三种方法可以告诉图像
图像资源在哪里
类#getResource(String)
的参数相同,只是路径必须是绝对的(即不相对于任何类)。此行为由图像
类记录:
可以将支持的所有URL传递给构造函数。如果传递的字符串不是有效的URL,而是路径,则在这种情况下,将在类路径上搜索图像
注意:如果您使用的是模块,则在使用此选项时会起作用。看Class#getResource(Sring)
返回的URL
转换为字符串即可
注意:还可以使用返回相同值的URL#toString()
类#getResourceAsStream(String)
。完成后不要忘记关闭InputStream
try (InputStream is = getClass().getResourceAsStream(...)) {
Image image = new Image(is);
}
注意,可以使用
java.util.ZIP.*
API、java.util.JAR.*
API或java NIO的ZipFileSystemProvider来访问ZIP/JAR文件的条目。其中的每一个,尤其是最后一个选项,都允许您访问与实际文件类似的ZIP/JAR文件条目,因为它们是专门为此而设计的。但是,在应用程序中使用资源时,应坚持使用Class#getResource(String)
和相关方法。确保fat jar文件也包含资源。看起来它好像不见了。通常情况下,如果您没有运行mvn compile
,则会发生这种情况,因为compile插件也会调用资源插件。问题:如果../computer.png
是一个资源,为什么您要尝试使用FileInputStream
来读取它?@JoséPereda。我没有调用mvn compile
,因为它对我不起作用。我得到的错误如下:Main.java:[5,26]包javafx.application不存在
@Slaw,因为我不知道如何做:)看看Maven部分,看看如何使用javafx Maven插件
插件来编译和运行您的项目。一旦你开始工作,尝试shade/jar插件来获得你的胖罐子。
try (InputStream is = getClass().getResourceAsStream(...)) {
Image image = new Image(is);
}