2017-02-17 35 views
-3

當我在eclipse中創建一個Maven項目時,我看到兩個嵌套的目錄:src/main/java和src/main/resources。我知道Maven是爲src/main/resources設計的,用於非代碼文件,但問題是:java如何區分java和資源目錄?

java如何知道如何查看資源文件夾而不是java文件夾中的任意文件查找this.getClass().getResourceAsStream("...")?我可以把一個文件放在java目錄下,但它不會被發現。有沒有什麼比-classpath更多用於指示文件的位置?它似乎必須存在,否則我可以將任意文件放入java或資源中。

+1

這與Java無關。這是關於Maven如何構建和打包項目的。查看Maven文檔,並查看生成的.jar文件的內容。 – Andreas

回答

2

這是一個關於如何Maven的問題的作品,而不是關於Java如何找到文件,但我會介紹一下。

Java的ClassLoader使用CLASSPATH查找類和資源,CLASSPATH對於部署的代碼通常是一組.jar文件。類加載器按照類路徑中列出的順序搜索.jar文件,直到找到類/資源。

Maven的具有src/main/javasrc/main/resources源文件的默認設置是純粹的Maven thing,並沒有任何與Java的類/資源加載。

在構建期間,Maven將編譯.java源文件在src/main/java中找到,並將編譯的.class文件放入target/classes。然後它會將.class文件與src/main/resources中的所有文件一起打包到.jar文件中。

生成的.jar文件將所有.class文件和資源文件放在一起,這就是Java可以找到它們的地方。

請注意,Maven構建過程會忽略src/main/java中的非.java文件。

如果你做一個Maven構建和看文件,你會看到這一切爲你自己。

0

Java從「環境」加載資源,在很多情況下,它使用Classpath中的所有jar來檢索資源。 Java中的資源加載稱爲位置獨立,因爲它與您的代碼運行時無關,它只需要正確的環境來查找資源。

給定Classpath中的所有jar和路徑,java將搜索相對於每個音調來查找指定的資源。您可以使用資源名稱指定資源。

的ClassLoader應用資源名稱不同

類加載器的方法使用給定String作爲 資源的名稱不應用任何絕對/相對變換(參見在課堂上 方法) 。該名稱不應該有一個前導「/」。 更多從http://www.thinkplexx.com/learn/howto/java/system/java-resource-loading-explained-absolute-and-relative-names-difference-between-classloader-and-class-resource-loading

這似乎必須有,否則我可以把任意文件中 Java或資源。

是的,你可以把任何地方的項目,但你應該閱讀的Maven的標準目錄佈局精心結構,把文件以下規則:

https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html