2011-10-04 404 views
1

我想讀我的Java Web應用程序中的屬性文件。我嘗試了這些解決方案:無法讀取Java Web應用程序中的屬性文件?

Where to place and how to read configuration resource files in servlet based application?

Howto access properties file from Java EE web application?

但他們沒有爲我工作。

這裏是我的應用程序的結構:

enter image description here

,讀取屬性文件被放置在一個類,甚至我把絕對路徑沒有工作的代碼。 A是一個普通的Java類。 但一切工作就像一個魅力如果讀性能代碼在servlet類(ProcessRequest.java)地方

這裏是我使用的代碼:

public class A { 
    public A() { 
     try { 
      Properties p = new Properties(); 
      p.load(this.getClass().getClassLoader().getResourceAsStream("/a.properties")); 
      String n = p.getProperty("name"); 
      System.out.println("name: " + n); 
     } catch (Exception ex) { 
      Logger.getLogger(A.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

任何想法?

回答

6

你把它放在servlets包,但是你想它從classpath根得到。領先的/使路徑相對於類路徑根。後來

p.load(this.getClass().getClassLoader().getResourceAsStream("a.properties")); 

無關到具體的問題,可能是:

修復相應的路徑:

p.load(this.getClass().getClassLoader().getResourceAsStream("/servlets/a.properties")); 

或者,假設當前類在servlets包已發生這種情況時,您將WAR外的屬性文件移動到外部位置,從而無需n即可輕鬆編輯該文件每次都要重建/重新部署,那麼我建議使用線程的上下文類加載器,而不是當前類的類加載器。它會在所有環境下工作:

p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("servlets/a.properties")); 

(注意,路徑不需要在這裏開始/,因爲它總是相對的classpath根)

+0

謝謝,這工作。但是,如果我將它移動到「網頁」文件夾,我如何才能讀取該屬性文件? – ipkiss

+1

這是你在第一個鏈接中找到的答案:'ServletContext#getResourceAsStream()'。但是如果你真的需要在網頁內容中而不是在類路徑中,我會考慮三次。 – BalusC

+0

但是,只有閱讀屬性代碼放在一個servlet類(我們得到ServletContext)時纔有效。這在我的情況下不起作用,這意味着閱讀代碼是在一個普通的類(A.java,在普通的java類中沒有這樣的ServletContext) – ipkiss

0

在構建應用程序之後,您是否看到WEB-INF/servlets下的屬性文件?如果是,那麼嘗試使用下面的行。

p.load(getServletContext().getResourceAsStream("/WEB-INF/servlets/a.properties")); 

,而不是這個

p.load(this.getClass().getClassLoader().getResourceAsStream("/a.properties")); 
+0

它不會在那裏結束。 – BalusC

相關問題