从jar文件加载同一目录下的文件

时间:2012-05-14 15:02:27

标签: java

我正在使用log4j进行日志记录。为了配置所有内容,我创建了一个在jar文件之外的log4j.xml。它工作得很好,但是当jar文件没有从log4j.xml所在的同一目录执行时会出现问题。

示例:jar文件位于/opt/myapp/test.jar

user@host:/opt/myapp$ java -jar test.jar

效果很好,但是当我尝试这个时:

user@host:~$ java -jar /opt/myapp/test.jar

我收到无法找到log4j.xml的错误。那是因为它正在我当前的工作目录中寻找它。

我还有一个属性文件,我在我的应用程序中使用。此文件位于jar文件所在的config /目录中,因此在此示例中为/ opt / myapp / config。尝试加载配置文件时会出现与上述问题相同的问题。

如何让Java从jar文件所在的目录中加载文件(无论执行jar的位置)?

可能非常容易,但我无法弄明白:(

5 个答案:

答案 0 :(得分:1)

您需要使用命令行参数-Dlog4j.configuration = / path / to / file传递该文件。

如果您需要更多选项,请检查the manual

答案 1 :(得分:0)

最可靠的方法是向JVM询问给定类的字节代码来自何处。

有关此代码段的信息,请参阅http://www.exampledepot.com/egs/java.lang/ClassOrigin.html

// Get the location of this class
Class cls = this.getClass();
ProtectionDomain pDomain = cls.getProtectionDomain();
CodeSource cSource = pDomain.getCodeSource();
URL loc = cSource.getLocation();  // file:/c:/almanac14/examples/

从JAR内部加载时,您需要进行更多的后期处理。

答案 2 :(得分:0)

答案 3 :(得分:0)

尝试:

java cp /opt/myapp/someohter.jar -jar /opt/myapp/test.jar

使用属性,指定自己,在哪里查找配置文件,资源等等(正如Paulo指出的那样)。

将这些文件放在靠近jar.file的位置通常是一个坏主意,并根据您从哪里开始执行。安装应用程序的目录(jar)通常会为用户写保护,但配置文件可以编辑。

答案 4 :(得分:0)

  1. 使用log4j系统属性指定,在命令的“-jar”部分之前添加: -Dlog4j.configuration = /选择/ MyApp的/的log4j.xml

  2. 将目录添加到类路径中,在命令的“-jar”部分之前添加:

    -cp / opt / myapp /

  3. 您可以在代码中手动指定log4j.xml文件,然后相对于您的jar文件引用它。

    String path = ...; PropertyConfigurator.configure(路径);