2017-04-06 3 views
0

Ich schreibe einfache Anwendung finden und ich habe irgendwie verloren - hier ist der Deal:Kann nicht Ressourcendatei unter Maven

Projektstruktur ist wie folgt:

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 

Wie Sie in der sehen Ressourcenordner Ich habe 2 Unterordner, einer davon ist für Daten, ein anderer für fxmls (diese App ist eine einfache JavaFX-Anwendung). Hier ist das Problem:

Code I zum Laden Szene verwenden

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

Code I zum Laden von Daten verwenden (Ich verwende opencsv Bibliothek)

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)); 

Ich hoffe, ich sende Genug Kontext, wenn nicht, bitte lass es mich wissen und ich werde bearbeiten (pom.xml ist sehr einfach, nichts Besonderes dort). Nun, dies unter IntelliJ funktioniert, aber wenn ich versuche, es mit Maven zu laufen, wie:

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

aus ProjectApp Verzeichnis, Anwendung läuft, aber ich bekomme FileNotFoundException (es lädt fxml Dateien, aber keine CSV-Dateien - ich erhalte Arbeitsanwendung, aber ohne Zugriff auf Daten). Außerdem muss ich beim Zugriff auf fxml-Dateien am Anfang des Pfades "NullPointerException" angeben, aber wenn ich auf csv-Dateien zugreife, muss ich das nicht tun (daher führt der Pfad "/database/ClientData.csv" dazu) NullPointerException)?

@EDIT

Eigentlich mit einer Verpackung zu sein Problem schien - wenn ich Anwendung auf JAR-Datei verpacken, fügt er Ausrufezeichen auf den Weg, so dass der Weg ist falsch (oder zumindest denke ich so).

Antwort

1

Zugriff auf CSV-Dateien darf ich nicht tun, dass (so Pfad „/database/ClientData.csv“ Ergebnisse in Nullpointer)

Weil, wenn Sie versuchen, Ressourcen laden von getClass().getClassLoader() nimmt es nicht Ausgangspfad mit /

warum, wenn Zugriff auf Dateien fxml I bereitstellen muss (Nullpointer wenn nicht) „/“ am Anfang des Weges

Denn wenn Sie bieten nicht die / am Anfang der Datei [fxml/Scene.fxml] es wird versucht, aus dem Paket der Klasse angeordnet sein, auf das die Methode aufgerufen wird, die wie myapp/controller/ClassName... sein oder so weiter, daher kann die Ressource nicht geladen werden.

Aber wenn Sie die / am Anfang der Datei zur Verfügung stellen [fxml/Scene.fxml] wird versucht, aus der Wurzel des Classpath befindet, daher ist es erfolgreich

+0

Dank gelegen, dass eine Menge erklärt . Aber wenn Pfade korrekt deklariert werden - und es funktioniert mit IDE - warum funktioniert es nicht, wenn ich versuche, es manuell mit Maven auszuführen? – 3michalzak

+0

Da Eclipse und andere IDEs benutzerdefinierte Klassenladeprogramme implementieren, um Ressourcen aus dem Projekt zur Laufzeit zu holen, und das funktioniert für Sie :) – mhasan

+0

also ... die eine, die ich bekam, ist falsch, aber weil ich einige benutzerdefinierte Klassenladeprogramme habe IntelliJ, das funktioniert? Was stimmt nicht mit meinem? – 3michalzak

Verwandte Themen