Java 查找conf文件,无论应用程序是如何启动的

Java 查找conf文件,无论应用程序是如何启动的,java,relative-path,Java,Relative Path,我是java的新手 我有一些目录结构 product/ conf/ classes/com/../.. product/ classes/com/../.. classes/conf/some_conf.properties conf/包含一些配置文件,而在classes/下我有我的应用程序 如何从java代码内部确保我能够在conf/中找到文件,而不管我是如何执行它的(例如从eclipse、从不同的目录、从crontab等

我是java的新手

我有一些目录结构

  product/
        conf/
        classes/com/../.. 
product/       
    classes/com/../..
    classes/conf/some_conf.properties
conf/
包含一些配置文件,而在
classes/
下我有我的应用程序

如何从java代码内部确保我能够在
conf/
中找到文件,而不管我是如何执行它的(例如从eclipse、从不同的目录、从crontab等等)

p.S.

conf/
中的文件不是资源,因为需要用户编辑。
有没有办法知道我的
.class
在哪里,这样我就可以使用该目录的相对路径来访问我的目录(例如my_class\u DIR/../../../../../../conf)

你可以通过以下方法找到工作目录的绝对路径:

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

我将把conf目录放入类路径中。这样,您可以通过以下方式找到它们:

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

使用相对路径比使用绝对路径更安全。即使你明天上课,它也会照常上课

在部署期间将配置文件放在类路径中。(请注意 项目目录结构可以不同于部署目录结构)

然后您可以使用Apache公共配置来获取文件的URL

URL urlOfFile = org.apache.commons.configuration.
ConfigurationUtils.locate("conf/some_conf.properties");
你可以尝试的另一种选择是

URL urlOfFile = <SomeClassFromClassesFolder>.class.
getClassLoader().getResource(resourceFile);
祝你好运

为了便于理解,您也可以参考以下内容:


祝你好运。

你可以使用绝对路径,包括生产方式

或者,您可以通过启动程序来使用配置设置,如

java -DXY_HOME=/some/path/product ...
从Java代码中,您可以使用它:

String xyHome = System.getProperty ("XY_HOME") 
或者在主目录中使用一种inifile,在其中指定在何处查找conf目录

反复阅读你的问题,我不清楚你的目标是什么。要独立于您所在的位置(eclipse、crontab等)查找conf dir?但是标题要求的是CWD,它是相反的-目录,这取决于你在哪里


两者都有可能,但你必须决定你想要什么

如果我从目录/a/b/c运行“java-cp a/b/c”,它会返回我/a/b/c或a/b/c吗?新文件(“”)将显示当前工作目录,独立于类路径。@dimba:配置文件在部署后的任何时候都会更改吗?程序是否需要更新它们,或者只是读取它们?System.getProperty(“user.dir”);user.dir将返回当前目录,而不是绝对路径。啊-现在我看到了标题,它要求或多或少的消息体的相反。CWD总是在变化(eclipse、crontab、不同的dir),而不是恒定的。正文似乎要求一个永不更改的目录。@用户标题不正确,我已更改了它。对不起inconvenience@dimba:“只是为了阅读它们”在这种情况下,我建议使用。我已经更改了问题的标题以消除普遍性。@Dconfdir给出了什么?如何从应用程序中引用它?-D开关用于传递配置。它可以是您想要的任何内容—字符串、数字、URL或IP、目录
java-help
显示
-D=设置系统属性
。对于单个系统安装,您可以使用应用程序已知的源代码中的固定路径。为了使整个内容可移动,可以将一个属性(最多是目录结构的根)即
product
指定为系统属性,这样您就可以处理不同的conf或instal dir(用户设置、版本),以及适应外部机器。(参见上面的代码)Accepted--D让我使用conf/而不是resource+1,特别是因为OP只需要对资源进行读访问。
String xyHome = System.getProperty ("XY_HOME")