我正在编写简单的应用程序而且我有点迷失 - 这是交易:
项目结构如下:
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文件时,它会在路径中添加感叹号,因此路径不正确(或者至少我认为是这样)。
答案 0 :(得分:1)
访问csv文件我不能这样做(所以路径 “/database/ClientData.csv”导致NullPointerException)
因为当您尝试从getClass().getClassLoader()
加载资源时,它不会从/
为什么在访问我必须提供的fxml文件时(如果是,则为NullPointerException) not)路径开头的“/”
因为如果你没有在文件[fxml / Scene.fxml]的开头提供/
,它将尝试从调用该方法的类的包中找到它,这将是像myapp/controller/ClassName...
那样,因此无法加载资源。
但是当您在文件[fxml / Scene.fxml]的开头提供/
时,它会尝试从类路径的根目录开始,因此它位于成功