2010-07-01 345 views
24

屬性文件位置是WEB-INF/classes/auth.properties如何讀取Web應用程序中的屬性文件?

我無法使用特定於JSF的方式(使用ExternalContext),因爲我需要一個不依賴於Web模塊的服務模塊中的屬性文件。

我已經嘗試過

MyService.class.getClassLoader().getResourceAsStream("/WEB-INF/classes/auth.properties"); 

但它返回null

我也試着用FileInputStream來讀它,但它需要完整的路徑是不可接受的。

任何想法?

回答

49

幾個注意事項:

  1. 你應該更喜歡通過ClassLoaderThread#getContextClassLoader()返回。

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    

    這將返回訪問所有資源parentmost類加載器。 Class#getClassLoader()將只返回有問題的類的(子)類加載器,它本身可能不能訪問所需的資源。它將始終在具有單個類加載器的環境中工作,但並不總是在具有類似webapps的類加載器的複雜層次結構的環境中。

  2. /WEB-INF文件夾不在類路徑的根目錄中。 /WEB-INF/classes文件夾是。所以你需要加載相關的屬性文件。

    classLoader.getResourceAsStream("/auth.properties"); 
    

    如果您選擇使用Thread#getContextClassLoader(),刪除前導/

它採用ServletContext#getResourceAsStream()「抽油煙機下」只能從web內容返回資源(那裏的/WEB-INF文件夾坐着)的具體JSF-ExternalContext#getResourceAsStream(),而不是從classpath。

+0

不在這種情況下 – unbeli 2010-07-01 18:48:31

+0

@unbeli:你是什麼意思? – Roman 2010-07-01 18:51:15

+1

@unbeli:當你將它作爲JAR發佈時,祝你好運:) – BalusC 2010-07-01 18:51:31

8

試試這個:

MyService.class.getClassLoader().getResourceAsStream("/auth.properties"); 

讀取文件與getResourceAsStream看起來在類路徑中尋找資源加載。由於classes目錄位於您的Web應用程序的類路徑中,因此應將該文件稱爲/auth.properties

5

ResourceBundle(http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html)通過屬性文件的相對/絕對路徑解決了大部分問題。

它使用Resource類並將其指向虛擬類以引用屬性文件。

例如:

  1. 你有一個文件調用MAINProperties.properties和裏面有一個屬性: mail.host = foo.example。com
  2. 創建一個名爲MAINProperties的啞類,沒有任何內容。
  3. 使用下面的代碼:

    ResourceBundle.getBundle( 「com.example.com.MAINProperties」)的getProperty( 「mail.host」)

,就是這樣。沒有InputStreams必需。

P.D. Apache Commons有一個名爲Apache Commons Configuration的庫,它具有很多功能(可重新加載的文件,多種域類型),可以與上述結合使用。

相關問題