Maven下找不到资源文件

Can't locate resource file under Maven

我正在编写简单的应用程序,但我有点迷路了 - 事情是这样的:

项目结构如下:

ProjectApp
|-- pom.xml
`-- .idea
`-- src
    -- main
       |-- java
       |   `-- myapp
       |       |-- components
       |       |   <some files>
       |       |-- controllers
       |       |   <some files>
       |       |-- repositories
       |       |   <some files>
       |       |-- Main.java
       `-- resources
           |-- database
           |    -- Data.csv
           `-- fxml
                -- Scene.fxml

正如您在资源文件夹中看到的,我有 2 个子文件夹,其中一个用于数据,另一个用于 fxmls(此应用程序是简单的 JavaFX 应用程序)。 现在,问题来了:

我用来加载场景的代码

String SCENE_PATH = "/fxml/Scene.fxml";
Parent root = FXMLLoader.load(getClass().getResource(SCENE_PATH));

我用于加载数据的代码(我使用的是 opencsv 库)

String DATA_PATH = "database/ClientData.csv";
ClassLoader classLoader = getClass().getClassLoader();
File dataFile = new File(classLoader.getResource(DATA_PATH).getFile());
CSVReader reader = new CSVReader(new FileReader(clientDataFile));

我希望我在这里提供了足够的上下文,如果没有,请告诉我,我会编辑(pom.xml 是非常基本的,没什么特别的)。现在,这在 IntelliJ 下工作,但是当我尝试使用 Maven 运行 它时,例如:

mvn clean package
java -cp ./target/ProjectApp.jar myapp.Main

来自 ProjectApp 目录,应用程序 运行s,但我得到 FileNotFoundException(它加载 fxml 文件,但没有 csv 文件 - 我得到工作应用程序,但无法访问数据)。另外,为什么在访问 fxml 文件时我必须在路径的开头提供(如果不是 NullPointerException)“/”,但是当我访问 csv 文件时我不能这样做(所以路径“/database/ClientData.csv”结果在 NullPointerException)?

@编辑

实际上问题似乎与打包有关 - 当我将应用程序打包到 jar 文件时,它会在路径中添加感叹号,因此路径不正确(或者至少我认为是这样)。

accessing csv files I must not do that (so path "/database/ClientData.csv" results in NullPointerException)

因为当您尝试从 getClass().getClassLoader() 加载资源时,它不会采用以 /

开头的路径

why when accessing fxml files I must provide (NullPointerException if not) "/" at the beginning of the path

因为如果您不在文件 [fxml/Scene.fxml] 的开头提供 /,它将尝试从 class 的包中找到它该方法被调用,类似于 myapp/controller/ClassName... 等,因此它将无法加载资源。

但是当您在文件 [fxml/Scene.fxml] 的开头提供 / 时,它将尝试从 class 路径的根目录开始定位,因此它定位成功