2012-01-31 44 views
4

指定測試classpath中我有以下目錄結構的Eclipse項目:如何在Eclipse

MyProj 
    >> src/main/java 
    >> src/main/config 
    >> src/test/java 
    >> src/test/config 

裏面src/test/config我有一個屬性文件名爲app.properties全屬性,這些屬性在src/main/javasrc/test/java使用兩個類。

所有,我使用查找屬性文件中的代碼如下所示:

try { 
    Properties props = new Properties(); 

    props.load(new FileInputStream("app.properties")); 

    someString = props.getProperty("app.title.color"); 
    // etc. 
} catch(Exception exc) { 
    // Handle exception... 
} 

然而,當我運行此我得到以下錯誤(catch子句中處理以上):

java.io.FileNotFoundException: app.properties(系統找不到指定的文件)

但是,當我將app.properties文件移至我的項目根目錄(與src/main/java處於同一級別)並重新運行代碼時,該文件效果很好。

顯然,這是一個類路徑問題。如果我去Build Path >> Configure Build Path >> Source我看到src/test/config實際上是在構建路徑上的源文件夾中。這可能並不意味着它也在類路徑 !!!

如何將Eclipse配置爲在類路徑上查找src/test/config以便我可以將我的屬性文件放在那裏,但仍然可以在運行時使用它(當我運行單元測試時)?

在此先感謝!

回答

3

的右擊牛逼的方式來做到這一點(這將確保你的代碼繼續工作,應該它曾經被放入一個JAR),是添加src/test/config到項目的類路徑,並使用ClassLoadergetResourceAsStream()方法加載的資源。例如

Thread.currentThread().getContextClassLoader().getResourceAsStream("app.properties") 
+0

dty - 我正要問:「如果我把它放在JAR裏?」 DNA的反應 - 你偷了我的腦子裏的話!謝謝! – IAmYourFaja 2012-01-31 23:22:35

+0

同意,這是一個更好的方法。我曾多次使用這種變體來加載相對於類的資源,但不知道getContextClassLoader()細節。謝謝。 – DNA 2012-01-31 23:29:08

2

這不完全是一個類路徑的問題(因爲你不是在這裏加載類!) - 問題是,你的代碼加載相對於當前的工作目錄,默認情況下爲你的項目的根文件。的FileInputStream不知道的類路徑是什麼 - 它只是用來加載文件!

你可以指定文件路徑:

props.load(new FileInputStream("src/test/config/app.properties")); 

雖然這將是最好指定config目錄下的命令行系統屬性(或者Eclipse運行配置文件):

-Dconfig.dir="src/test/config/" 

然後加載相對文件到這個目錄下,是這樣的:

public static final String CONFIG_DIR = System.getProperty("config.dir"); 
props.load(new FileInputStream(CONFIG_DIR+"app.properties")); 
+0

感謝DNA和多數民衆贊成在一個偉大的建議 - 我正要問你一個後續問題,但dty回答之前,我可以問。再次感謝(我upvoted你的答案)。 – IAmYourFaja 2012-01-31 23:23:14

0

的文件夾合併,但是你要訪問的屬性文件不同,如相對於資源類:

InputStream is = YourClassName.class.getResourceAsStream("/app.properties"); 

注意開頭的「/」。