无法在Maven下找到资源文件

时间:2017-04-06 19:53:57

标签: java maven opencsv

我正在编写简单的应用程序而且我有点迷失 - 这是交易:

项目结构如下:

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目录,应用程序运行,但我得到FileNotFoundException(它加载fxml文件,但没有csv文件 - 我得到工作应用程序,但无法访问数据)。另外,为什么在访问fxml文件时我必须提供(如果没有,则为NullPointerException)&#34; /&#34;在路径的开头,但是当我访问csv文件时,我不能这样做(所以路径&#34; /database/ClientData.csv"导致NullPointerException)?

@EDIT

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

1 个答案:

答案 0 :(得分:1)

  

访问csv文件我不能这样做(所以路径   “/database/ClientData.csv”导致NullPointerException)

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

开始
  

为什么在访问我必须提供的fxml文件时(如果是,则为NullPointerException)   not)路径开头的“/”

因为如果你没有在文件[fxml / Scene.fxml]的开头提供/,它将尝试从调用该方法的类的包中找到它,这将是像myapp/controller/ClassName...那样,因此无法加载资源。

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