2010-07-13 71 views
6

喂,getResourceAsStream在新環境下失敗?

我有代碼以下行:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

,我知道與COM/thinkplexx /郎/德/ general.xml這罐子是在類路徑中。

它工作在「以前的環境」,這是maven2構建。

現在,我評估maven3,它不工作!我知道,如果我改變的代碼是:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("com/thinkplexx/lang/de/general.xml"); 

它的偉大工程(我只是刪除從資源路徑的第一個斜槓)。

順便說一句,我使用Linux。路徑中的第一個斜槓通常意味着「從根目錄」,所以如果這個邏輯對於Java資源加載也是合理的,那麼第一個例子應該從來沒有工作過!

問題:第一個代碼示例有問題,即/com/而不是com/?它只是不好的代碼,或者它意味着不同的東西?

謝謝!

+0

德文斯的答案適合我。另外,我在 http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/guide/lang/resources.html發現: 「 ClassLoader中的方法使用給定的String作爲資源的名稱,而不應用任何絕對/相對轉換(請參見Class中的方法)。名稱不應包含前導「/」 「 – 2010-07-13 16:11:34

回答

7

這取決於你如何獲取資源。當你使用的ClassLoader如下:

InputStream stream= getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

領先的'/'是沒有意義的。所以,正確的格式是「com/thinkplexx/lang/de/general.xml」。

相反如果你使用一個 '類',如:

InputStream stream= getClass().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

你得到一個不同的行爲。 Class.getResourceAsStream將考慮沒有領先'。'的類。與包含該類的包相關。使用前導'。'指定的資源是絕對的,或者相對於jar的根來解析。

所以,如果thiscom.example.SomeThing參考,那麼預期的行爲是:

getClass().getResourceAsStream("https://stackoverflow.com/a/b/c.xml") ==> a/b/c.xml 
getClass().getResourceAsStream("a/b/c.xml") ==> com/example/a/b/c.xml 
getClass().getClassLoader().getResourceAsStream("a/b/c.xml") ==> a/b/c.xml 
getClass().getClassLoader().getResourceAsStream("https://stackoverflow.com/a/b/c.xml") ==> Incorrect 

的Maven2當時正在鬆懈,讓最後的形式。