2017-04-06 24 views
0

我寫簡單的應用程序下找到資源文件和我有點失去了 - 這裏是處理:不能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應用程序)。 現在,這裏的問題是:

代碼我使用的加載場景我使用的加載數據(我用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)); 

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

代碼我希望我提供這裏有足夠的上下文,如果沒有,請讓我知道,我會編輯(pom.xml是非常基本的,沒有什麼幻想)。現在,這個工程的IntelliJ下,但是當我嘗試使用Maven的運行,如:

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

從ProjectApp目錄,應用程序運行,但我得到FileNotFoundException異常(它加載FXML文件,但沒有CSV文件 - 我得到工作應用程序,但無法訪問數據)。另外,爲什麼在訪問fxml文件時,我必須在路徑的開始處提供(如果不是NullPointerException)「/」,但是當我訪問csv文件時,我不能這麼做(因此路徑「/database/ClientData.csv」導致空指針異常)?

@EDIT

其實問題似乎是與包裝 - 當我打包的應用程序jar文件,它增加了感嘆號的路徑,這樣的路徑是不正確的(或至少我是這麼認爲的)。

回答

1

訪問CSV文件,我不能這樣做(這樣路徑NullPointerException異常 「/database/ClientData.csv」結果)

因爲當你嘗試從getClass().getClassLoader()加載資源不採取路徑開始/

爲什麼訪問FXML文件時,我必須提供(NullPointerException - 如果 不)「/」的路徑的開始

因爲如果您在文件[fxml/Scene.fxml]的開頭沒有提供/,它將嘗試從調用該方法的類的包中找到,這將類似於myapp/controller/ClassName...等等,因此它將無法加載資源。

但是,當你在你的文件的開頭提供/ [FXML/Scene.fxml]它會試圖從classpath的根目錄位置,因此它位於成功地

+0

謝謝,這解釋了很多。但是,如果路徑被正確聲明 - 並且它使用IDE - 爲什麼當我嘗試使用maven手動運行時它不工作? – 3michalzak

+0

由於Eclipse和其他IDE實現自定義類加載器在運行時從項目中獲取資源,並且適用於您:) – mhasan

+0

所以...我得到的那個是錯誤的,但是因爲我有一些自定義類加載器IntelliJ,工作?我的怎麼了? – 3michalzak