当前位置: 首页 > 知识库问答 >
问题:

为什么jar文件中的JAVA中的相对路径不起作用?[副本]

邬承悦
2023-03-14

我有一个简单的JavaFX项目。它包括:

  • src/app/main.java
  • src/app/controller/maincontroller.java
  • src/app/controller/secondarywindowcontroller.java
  • src/app/view/main.fxml
  • src/app/view/secondarywindow.fxml

控制器MainController.java有方法(按钮的处理程序):

public void openWindow(ActionEvent event) {
    Pane root = null;
    try {
        System.out.println("URL: " + getClass().getResource("../view/SecondaryWindow.fxml"));
        FXMLLoader loader = new FXMLLoader(getClass().getResource("../view/SecondaryWindow.fxml") );
        root = loader.load();
    }
    catch(Exception e) {
        e.getMessage();
        e.printStackTrace();
    }
    if (root != null) {
        Scene scene = new Scene(root,400,100);
        Stage secStage = new Stage();
        secStage.setTitle("Secondary Window");
        secStage.setScene(scene);
        secStage.show();
    }
}

如果从编译文件运行项目,则代码getClass().getResource(“../view/secondarywindow.fxml”)返回正确URL。但如果我从jar-file运行project,则返回null。

我使用以下方式编译文件:

javac -d bin src\app\Main.java
javac -d bin src\app\controller\*.java
XCOPY src\app\view\*.fxml bin\app\view /s /e /d /y

并使用以下方法运行编译文件:

java -classpath bin app.Main

目录bin具有类似的文件结构:

  • bin/app/main.class
  • bin/app/controller/maincontroller.class
  • bin/app/controller/secondarywindowcontroller.class
  • bin/app/view/main.fxml
  • bin/app/view/secondarywindow.fxml

我使用以下方法创建jar文件:

jar cvfm SimpleFXMLApp.jar manifest.mf -C bin app

MANIFEST.MF

Manifest-Version: 1.0
Created-By: Denys Selivanov
Main-Class: app.Main

为什么相对路径在JAR-file中不起作用,而getClass().getResource(“../view/secondarywindow.fxml”)返回null?怎么修复?

解决问题的方法之一是将控制器和视图文件保存在一个目录中,并使用相对路径“secondarywindows.fxml”,但我希望保留项目的结构文件。

你可以在这里下载我的项目。此链接将访问30天。

共有1个答案

路思源
2023-03-14

我看到投票关闭说它是这个问答的重复,但我不认为它解释了..的细节,所以这里是:

..适用于文件系统上的资源,因为..是文件系统上指向父目录的实际条目。但这在JAR中不存在,所以当类和资源打包在JAR中时,指向“父包”是行不通的。

解决方案:如果可以接受controller类对main类的依赖关系,则可以改为执行以下操作:

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

在任何情况下,您都需要引用包层次结构中足够高的类,或者使用根包的绝对路径(getClass().getClassLoader().getResource(“app/view/secondarywindow.fxml”))。

 类似资料:
  • 问题内容: 我有以下结构 include.php文件具有以下内容 在index.php页面中,我包括了 当我打开页面index.php时,出现以下警告和致命错误。我不明白是什么原因导致此错误。当我给出绝对路径时,它可以工作。但是我相信绝对的路线不是一个好主意。 提前致谢 问题答案: 采用 获取脚本的当前路径,这应该可以解决您的问题。 所以: 这样可以防止您可以从其他文件夹运行PHP脚本的情况,因此

  • 一个Java代码如下: 如果我从扩展类路径中删除hello.jar,并将其复制到也包含rt.jar的引导类路径(usr/lib/jvm/java-8-openjdk-amd64/jre/lib/),那么我的程序就无法工作。 据我所知,引导程序或扩展类加载程序中的所有jar文件都可以在程序中使用。如果这个异常是正确的,为什么Java会抛出这个异常?如果我不正确,请指导我。

  • 问题内容: 我的程序需要读取一些文本配置文件。我当前的代码是: 当我在eclipse中本地运行它时,此方法有效,尽管我确实必须进行破解以处理路径名中的空间。配置文件与上述方法位于同一软件包中。但是,当我将应用程序导出为jar时,出现了问题。该jar位于共享的映射网络驱动器Z:上。当我从命令行运行应用程序时,出现此错误: java.io.FileNotFoundException:文件:\ Z:\

  • 问题内容: 我想知道如何指定存储在Java项目的src文件夹中的文本文件的相对路径名。我想用此文本文件的路径存储一个字符串。例如,如果我的java项目的src文件夹中有example.txt,我将如何查找其相对路径?我也在我的主机中这样做,所以我在使用.getResource()时遇到了麻烦。我该怎么做?谢谢。 我的文件路径是从Eclipse /MyProject/src/data.txt中的属性

  • 问题内容: 如果将PHP脚本作为cron脚本运行,则如果使用相对路径,则include常常会失败。例如,如果您有 在命令行上运行时会找到文件foo.php,但从cron脚本运行时找不到。 一个典型的解决方法是先chdir到工作目录,或使用绝对路径。但是,我想知道导致此行为的cron和shell之间的区别是什么。在cron脚本中使用相对路径时,为什么会失败? 问题答案: 从cron运行时,脚本的工作

  • 我试图合并2个简单的程序。我想制作成一个。jar文件,这是我编写的代码:(Project1.jar和Project2.exe都打包到这个。jar中) 当我在eclipse中运行项目时,一切都很好(两个文件都像我想要的那样被执行)。但是当我将这个项目导出到。jar并运行它时,什么也没有发生。我认为它与文件路径有关,因为它在Eclipse中运行时工作得很好。怎么解决这个?