[英]Load properties file in JAR?
當我的網絡應用程序所依賴的其中一個罐試圖從jar中加載屬性文件時,我遇到了麻煩。 這是jar中的代碼。
static
{
Properties props = new Properties();
try
{
props.load(ClassLoader.getSystemResourceAsStream("someProps.properties"));
} catch (IOException e)
{
e.printStackTrace();
}
someProperty = props.getProperty("someKey");
}
屬性文件位於Maven項目的“src / main / resources”目錄中。 當我在Eclipse中的junit測試中運行此代碼時,它執行得很好。 當項目使用Maven構建到jar中,並作為依賴項包含在我的Web應用程序中時,它無法找到屬性文件。 我知道屬性文件位於依賴於jar的基本目錄中,我不知道如何解決這個問題。
問題是您正在使用getSystemResourceAsStream
。 使用getResourceAsStream
。 系統資源從系統類加載器加載,幾乎可以肯定不是在作為webapp運行時加載jar的類加載器。
它在Eclipse中工作,因為在啟動應用程序時,系統類加載器配置為您的jar作為其類路徑的一部分。 (例如,java -jar my.jar將在系統類加載器中加載my.jar。)Web應用程序不是這種情況 - 應用程序服務器使用復雜的類加載將Web應用程序彼此隔離,並與應用程序服務器的內部隔離。 例如,請參閱tomcat類加載器的方法 ,以及使用的類加載器層次結構的圖表。
編輯:通常,您可以調用getClass().getResourceAsStream()
來檢索類路徑中的資源,但是當您在靜態初始化程序中獲取資源時,您需要顯式命名您想要的類加載器中的類。從...加載。 最簡單的方法是使用包含靜態初始化程序的類,例如
[public] class MyClass {
static
{
...
props.load(MyClass.class.getResourceAsStream("/someProps.properties"));
}
}
有關記錄,請參閱如何向JAR添加資源? (圖示為單元測試,但同樣適用於“常規”資源):
要為單元測試的類路徑添加資源,您將遵循與向JAR添加資源相同的模式,除了您放置資源的目錄是
${basedir}/src/test/resources
。 此時,您將擁有一個項目目錄結構,如下所示:my-app |-- pom.xml `-- src |-- main | |-- java | | `-- com | | `-- mycompany | | `-- app | | `-- App.java | `-- resources | `-- META-INF | |-- application.properties `-- test |-- java | `-- com | `-- mycompany | `-- app | `-- AppTest.java `-- resources `-- test.properties
在單元測試中,您可以使用以下代碼的簡單代碼段來訪問測試所需的資源:
... // Retrieve resource InputStream is = getClass().getResourceAsStream("/test.properties" ); // Do something with the resource ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.