簡體   English   中英

在JAR中加載屬性文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM