2014-02-14 132 views
1

我有一個Maven項目,我試圖打包成一個戰爭和一個jar。作爲我的應用程序/ servlet初始化的一部分(取決於我是運行jar還是war),我需要讀取一個名爲server.ini的文件。我已經把src/main/resources/server.ini文件,我試圖加載它,像這樣:從戰爭中加載配置文件

System.class.getResourceAsStream("server.ini"); 

然而,這總是導致null。我究竟做錯了什麼?

回答

1

server.ini文件應位於資源目​​錄的根目錄中。

通過將它放在webapp中,您可以通過http使該文件可用,但您需要通過classpath訪問該文件,這意味着您應該將其置於資源目錄中。

+0

這正是我想要做的:加載配置文件作爲一個資源,所以它工作,無論我是否運行的戰爭或罐子。我已經更新了我的問題以使其更清楚。然而,我試圖加載文件作爲資源在jar和war中都失敗了。我確信我正在做一些微不足道的事情,但不知道它是什麼。 : -/ –

+0

你正在用maven構建嗎?將文件放在資源目錄中將導致它成爲需要的地方。如果你把它放在資源的子目錄中,那麼你需要調整你的java行來引用子目錄。 –

+0

現在我知道這個微不足道的錯誤是什麼:我需要用斜槓加上我的文件名,否則類加載器會在'java.lang'中查找。所以這個工作:'this.getClass()。getResourceAsStream(「/ server.ini」)' –

1

有一個很好的機會web.xmlcontext.xml是更適合你想要做什麼,而是......

嘗試把server.iniWEB-INF/classes,或做類似this

+0

你不應該直接在WEB-INF/classes中放入任何東西。當你告訴它清理乾淨,Maven會清除那個目錄,你會丟失你的文件。該目錄實際上受Maven控制。 –

+0

但我同意你最好使用web.xml來配置你的服務器。 –

+0

如果我只在一個servlet容器中運行它,我可以使用web.xml。但是,我需要它也用完一個罐子。 –

1

問題是我使用的系統classloader具有不合格的路徑,所以它期望在java.lang包中找到我的server.ini

由於我的文件在src/main/resources,我就用我的當前類的類加載器,以絕對路徑:

getClass().getResourceAsStream("/server.ini") 

這個工程在戰爭中的jar兩者。

Preferred way of loading resources in Java」問題對資源加載有很好的解釋。