2009-09-30 76 views
3

我使用此代碼片段獲取文件作爲輸入流。文件version.txt打包在我的應用程序的jar中,位於最上面的文件夾中。ClassLoader加載錯誤的文件

InputStream resource = getClass().getClassLoader().getResourceAsStream("version.txt"); 

這個幾乎所有的時間都適用。但是對於一個用戶來說,它正在挑選另一個version.txt,這不在我的jar中。我怎樣才能確保這加載我的jar中的特定version.txt文件?

回答

9

當你說「最上面的文件夾」時,你是指默認包?如果是這樣的話,你必須確保你的JAR早於類路徑,而不是像其他version.txt文件一樣沿着類路徑搜索,直到它找到第一個匹配。

因爲很難保證你的JAR將永遠是第一位,你真的應該放置version.txt文件在非默認的包,如:

com.yourcompany.yourproject.version 

然後你需要修改代碼找到它:

Stream resource = getClass().getClassLoader().getResourceAsStream("com/yourcompany/yourproject/version/version.txt"); 

使用默認包是反模式。

+0

哦,男孩。我稱自己是Java專家,但我使用這種反模式。我感到慚愧...... :-)初步測試顯示您的解決方案可行! – 2009-09-30 12:39:12

+0

正如他們所說,失敗是最好的老師;-) – SteveD 2009-09-30 12:45:04

3

這是將事物置於頂層包裝中固有的危險,您可以挑選出您並非真正想要的東西。這可能是一個好處(例如使用log4j配置),但它通常不是你想要的。

我強烈建議將您的version.txt放在應用程序的包裝結構中,例如,在com.myapp(或任何你的包名),然後從那裏使用

getClass().getClassLoader().getResourceAsStream("com/myapp/version.txt"); 
0

的代碼片段將使用的類加載器加載的是這個類找到version.txt文件加載它。 如果文件存在於類加載器在多個位置使用的類路徑中,則它可能會返回錯誤的文件(具體取決於類路徑順序)。