2011-05-25 44 views
3

我是java的新手。無論應用程序如何啓動,查找conf文件

我有一些目錄結構

product/ 
     conf/ 
     classes/com/../.. 

conf/包含了一些配置文件,而classes/下,我有我的應用程序。

如何確保從java代碼內部我能夠在conf/中找到文件,儘管我正在執行它(例如從eclipse,從不同目錄,從crontab等)。

P.S.

conf/中的文件不是資源,因爲需要由用戶編輯。 有沒有辦法知道我的.class在哪裏,所以我可以使用相對路徑形式到那個目錄下我的目錄(例如MY_CLASS_DIR /../../../../conf)

+0

@dimba:配置文件在部署後隨時更改嗎?程序是否需要更新它們,或只是讀取它們? – 2011-05-25 07:47:47

+0

@Andrew只讀它們 – dimba 2011-05-25 07:49:41

+0

System.getProperty(「user.dir」)); – mKorbel 2011-05-25 07:59:35

回答

2

您可以使用絕對路徑,包括產品的方式。

或者,您可以通過啓動你的程序像

java -DXY_HOME=/some/path/product ... 

從javacode使用配置設置,你使用它:

String xyHome = System.getProperty ("XY_HOME") 

或者你用一種ini文件在你的home目錄,您可以在其中指定要查找conf目錄的位置。

重讀您的問題多次,我不清楚你的目標是什麼。要獨立於您的位置(eclipse,crontab,...)來查找conf目錄?但標題要求CWD,而相反 - 目錄,取決於你在哪裏。

兩者都是可能的,但你必須決定你想要什麼。

+0

我已更改問題的標題以刪除無處不在。 – dimba 2011-05-25 08:28:42

+0

@What -Dconfdir給出了什麼?我如何從應用程序中引用它? – dimba 2011-05-25 08:36:53

+0

-D開關用於傳遞配置。它可以是任何你想要的 - 一個字符串,一個數字,一個URL或IP,一個目錄。 'java -help'顯示'-D = 設置系統屬性'。對於單個系統安裝,您可以使用源應用程序已知的固定路徑。爲了使整個事物可以移動,一個屬性,最好是你的目錄結構的根,也就是'product'可以被指定爲一個系統屬性,並且這樣你就可以處理不同的conf或installation-users(用戶設置,版本),以及適應國外機器。 (請參閱上面的代碼)。 – 2011-05-25 09:02:40

0

你可以找出什麼是工作目錄的絕對路徑:

String str = new File("").getAbsolutePath() 
+0

如果我從目錄/ A/B/C運行「java -cp a/b/c」,它會返回我/ A/B/C還是a/b/c? – dimba 2011-05-25 07:45:46

+0

新文件(「」)將顯示當前工作目錄,與您的類路徑無關。 – 2011-05-25 08:08:50

4

我會把conf目錄放到類路徑中。這樣你總能找到它們:

YourClass.class.getClassLoader().getResource("conf/...."); 
+0

+1尤其是因爲OP只需要*讀取*資源。 – 2011-05-25 08:41:23

1

它可以安全地使用相對路徑而不是絕對路徑。即使你JAR你的類明天將工作就是

把你的配置文件在classpath中部署過程中。(請注意, 項目的目錄結構可以不同於部署目錄結構)

product/  
    classes/com/../.. 
    classes/conf/some_conf.properties 

然後你可以使用Apache的常見配置,以獲取文件

URL urlOfFile = org.apache.commons.configuration. 
ConfigurationUtils.locate("conf/some_conf.properties"); 

你可以嘗試另一種方法是的URL,

URL urlOfFile = <SomeClassFromClassesFolder>.class. 
getClassLoader().getResource(resourceFile); 

一旦你的配置文件中獲取流出來的非常簡單的URL,

InputStream stream = urlOfFile.openStream(); 

好運。

你諒解,你可以參考以下的爲好,

http://bethecoder.com/applications/tutorials/showTutorials.action?tutorialId=Java_IO_CurrentWorkingDirectory

http://bethecoder.com/applications/tutorials/showTutorials.action?tutorialId=Java_Reflection_WheretheClassloadedfrom 好運。