我有一個Maven項目,我試圖打包成一個戰爭和一個jar。作爲我的應用程序/ servlet初始化的一部分(取決於我是運行jar還是war),我需要讀取一個名爲server.ini
的文件。我已經把src/main/resources/server.ini
文件,我試圖加載它,像這樣:從戰爭中加載配置文件
System.class.getResourceAsStream("server.ini");
然而,這總是導致null
。我究竟做錯了什麼?
我有一個Maven項目,我試圖打包成一個戰爭和一個jar。作爲我的應用程序/ servlet初始化的一部分(取決於我是運行jar還是war),我需要讀取一個名爲server.ini
的文件。我已經把src/main/resources/server.ini
文件,我試圖加載它,像這樣:從戰爭中加載配置文件
System.class.getResourceAsStream("server.ini");
然而,這總是導致null
。我究竟做錯了什麼?
server.ini
文件應位於資源目錄的根目錄中。
通過將它放在webapp
中,您可以通過http
使該文件可用,但您需要通過classpath
訪問該文件,這意味着您應該將其置於資源目錄中。
有一個很好的機會web.xml
或context.xml
是更適合你想要做什麼,而是......
嘗試把server.ini
在WEB-INF/classes
,或做類似this。
你不應該直接在WEB-INF/classes中放入任何東西。當你告訴它清理乾淨,Maven會清除那個目錄,你會丟失你的文件。該目錄實際上受Maven控制。 –
但我同意你最好使用web.xml來配置你的服務器。 –
如果我只在一個servlet容器中運行它,我可以使用web.xml。但是,我需要它也用完一個罐子。 –
問題是我使用的系統classloader具有不合格的路徑,所以它期望在java.lang
包中找到我的server.ini
。
由於我的文件在src/main/resources
,我就用我的當前類的類加載器,以絕對路徑:
getClass().getResourceAsStream("/server.ini")
這個工程在戰爭中的jar兩者。
「Preferred way of loading resources in Java」問題對資源加載有很好的解釋。
這正是我想要做的:加載配置文件作爲一個資源,所以它工作,無論我是否運行的戰爭或罐子。我已經更新了我的問題以使其更清楚。然而,我試圖加載文件作爲資源在jar和war中都失敗了。我確信我正在做一些微不足道的事情,但不知道它是什麼。 : -/ –
你正在用maven構建嗎?將文件放在資源目錄中將導致它成爲需要的地方。如果你把它放在資源的子目錄中,那麼你需要調整你的java行來引用子目錄。 –
現在我知道這個微不足道的錯誤是什麼:我需要用斜槓加上我的文件名,否則類加載器會在'java.lang'中查找。所以這個工作:'this.getClass()。getResourceAsStream(「/ server.ini」)' –