Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何告诉Java JAR文件中的正确文件路径?_Java_Javafx_Java 11_Openjfx - Fatal编程技术网

如何告诉Java 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 当我

我已将所有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
当我有这个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中显示图像,我假设您正在使用该类。基本上有三种方法可以告诉
图像
图像资源在哪里

  • 在参数URL没有方案的情况下使用。在这种情况下,类将URL视为相对于类路径根的路径,并尝试相应地访问图像。基本上,该参数与您给
    类#getResource(String)
    的参数相同,只是路径必须是绝对的(即不相对于任何类)。此行为由
    图像
    类记录:

    可以将支持的所有URL传递给构造函数。如果传递的字符串不是有效的URL,而是路径,则在这种情况下,将在类路径上搜索图像

    注意:如果您使用的是模块,则在使用此选项时会起作用。看

  • 使用与上述相同的构造函数,但传递有效的URL(即,它有一个方案)。使用资源时,只需使用将
    Class#getResource(Sring)
    返回的
    URL
    转换为
    字符串即可

    注意:还可以使用返回相同值的
    URL#toString()

  • 使用。在这里,您可以使用
    类#getResourceAsStream(String)
    。完成后不要忘记关闭
    InputStream

    try (InputStream is = getClass().getResourceAsStream(...)) {
        Image image = new Image(is);
    }
    
  • 所有这些都假设在构建JAR文件时,资源已经正确打包在JAR文件中。如果情况并非如此,请首先遵循JoséPereda在问题评论中给出的建议



    注意,可以使用
    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);
    }