2017-05-09 69 views
1

我無法理解如何以eclipse和jar的方式加載資源。Java classLoader和getResourceAsStream

在我的項目中,我有一個源文件,src。 在那之下,我創建了一個新的包,可以將資源(圖像,音頻..)導入到。 因此它的資源爲src/resources,而src/com/Mainclass.java

現在,我從其他答案瞭解,.class.getResource(); 開始在類的目錄中查找。除了從eclipse提取jar的類的目錄改變。 換句話說,

MainClass.class.getResourceAsStream("/resources/img.png") 

只在Eclipse工作

我甚至不確定它爲什麼可行,因爲資源與主類不在同一條路徑中。我會反而期待../resources/img.png工作,因爲我們會從com。src/,其中資源是。

不過,一旦我提取物作爲一個罐子,我覺得裏面,分離:

<root of the jar>/com/mainclass.java 

<root of the jar>/src/resources 

所以這是行不通的。

更簡單的解決方案是:如何找到MainClass.class.getResourceAsStream(「/ resources/img.png」)加載的確切目錄? 我試過把/ resources /放在每個子文件夾中,但它仍然無法工作。 IT將在eclipse之外工作,如果資源文件夾與jar相同,但不在jar本身內。

這裏是我的構建路徑:

enter image description here

我沒有外部庫,項目是一個Maven Java項目。

+1

我認爲你應該閱讀Maven的基本文檔。 Eclipse中使用的源代碼/編譯佈局以Eclipse方式(很多)和Maven方式(一點)混合使用。 – davidxxx

+0

爲了全局理解,請閱讀:https://maven.apache.org/guides/getting-started/。 有關資源需求,請閱讀:https://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory。html – davidxxx

回答

3

這些資源應該在src/main/resources之下(如果它們將成爲應用程序的一部分),或者在src/test/resources之下,如果它們僅用於測試而不是最終工件的一部分。

Maven的副本從src/main/resourcestarget/classes的資源和那些從src/test/resourcestarget/test-classes。在測試過程中,target/classes和`target/test-classes被添加到類路徑中。

所以,你的代碼實際上應該是這個樣子:

MainClass.class.getResourceAsStream("/img.png") 
+0

我upvote從根本上是正確的,但我不知道它會解決它的問題,因爲我看到他的Eclipse配置和他對Maven – davidxxx

+1

@davidxxx的知識,我知道你的意思。我相信'src/resources'目錄的內容應該簡單地移到'src/main/resources'下,這應該把它整理出來。 – carlspring

+0

@carlspirng那麼你是否建議我將src/resources移動到src/main/resources中,然後將每次調用資源的代碼更改爲MainClass.class.getResourceAsStream(「/ img.png」)?只是爲了看看我是否得到了正確的 –