2011-05-25 48 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 好运。