2016-10-10 66 views
0

我想訪問我的項目「\ src \ main \ resources」的資源形式,但出於任何原因,我只能訪問目標類。 這裏是我的代碼:不能訪問資源路徑,只有目標路徑

System.out.println(Main.class.getResourceAsStream("/123.txt")); // [email protected] 
System.out.println(Main.class.getResource("/123.txt")); // file:/C:/Users/Raul/workspace/Serial/target/classes/123.txt 
System.out.println(Thread.currentThread().getContextClassLoader().getResource("123.txt").getPath()); // /C:/Users/Raul/workspace/Serial/target/classes/123.txt 

,在這裏我的項目迪爾斯:

project dirs

的事情是,即使我的所有文件刪除目標/ classes和運行代碼時,編譯器會將這些文件從「src/main/ressources」複製到「目標/類」中並從那裏讀取它們。

回答

0

我想訪問我的項目「\ src \ main \ resources」的資源形式,但出於任何原因我只能訪問目標類。

我認爲這個問題由用戶@VGR回答。只是爲了澄清它在另一個詞:

  • 你把你的資源在/src/main/resources文件夾,這些resouces將保持原樣複製到當你建立你的項目/target/classes文件夾。

src/main/resouces/123.txt -> target/classes/123.txt 
src/main/resources/myresources/145.txt -> target/classes/myresources/145.txt 
... 

現在,如果你運行的程序的IDE裏面你會看到如下:

System.out.println(Main.class.getResource("/123.txt")); 

輸出:文件:/ C:/用戶/ Raul/workspace/Serial/target/classes/123.txt

System.out.println(Main.class.getResource("/myresources/145.txt")); 

輸出:file:/ C:/ Users/Raul/workspace/Serial/target/classes/myresources/145。TXT

,如果你打開生成的文件jar你不會看到target文件夾,因爲該文件123.txt將在jar文件和文件145.txt根將是該文件夾下myresources/145.txt

文件夾目標只是構建工具的輸出目錄,不會打包到jar文件中。

我們以下問題:

的問題是,我不知道如何將目標類導出到我的罐子,或者我怎樣才能得到「的src/main/ressources」的返回值。

要回答這個問題,您必須查看您的項目根目錄中的pom.xml文件。它應該有一個<packaging>jar</packaging>條目。如果是這樣,你創建的JAR文件如下:

方案1:通過命令行

mvn clean install 

的jar文件將被創建和複製到文件夾target

選項2:在Eclipse(例如)

right click on the pom.xml > Run AS > Maven install 

jar文件也應該生成並複製到文件夾target

注意:在您的屏幕截圖中有兩個jar文件:core-0.0.1-SNAPSHOT.jarSerial-0.0.1-SNAPSHOT.jar;在生成jar文件之前,將它們移除(mvn clean或右鍵單擊>運行AS> Maven clean)。原因是Maven只能爲每個Maven模塊/項目afaik生成一個jar文件。

+0

thx爲偉大的幫助球員 –

0

您正在看到預期的行爲。一個Java程序是編譯成成可執行的形式 - 含義,.class文件和資源。當其他用戶運行您的程序時,他們將無法訪問源代碼,因此您的代碼不應假定您的源代碼樹將可用。

簡而言之,您的代碼是正確的。不要嘗試閱讀源代碼樹。如果您希望目標/類包含最新文件,請重建您的項目。

請注意:千萬不要使用URL的getPath()方法將URL轉換爲文件名。有許多字符在URL中是不允許的,爲了符合URL規範,這些字符將被「百分比轉義」。因此,URL的路徑部分不是vaid文件名!將URL轉換爲文件的唯一正確方法是Paths.get(url.toURI())。但是,甚至不應該嘗試將資源轉換爲文件,因爲一旦移動到將程序打包到.jar文件中,資源就不會以普通文件的形式存在,只能作爲.jar文件中的條目存在(這實際上只是添加了一些特定於Java的條目的zip文件)。

+0

但我將我的項目導出到jar文件並查看後,ressource文件夾在那裏,也是我所有的ressourcesc。我需要的是解決資源路徑問題的解決方案。 thx –

+0

如果'Main.class.getResource(「/ 123.txt」)'已經返回一個有效的對象,那有什麼問題? – VGR

+0

問題是我不知道如何將目標類導出到我的jar中,或者如何獲得「src/main/ressources」作爲返回值。 –