2

我正在使用 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)?

可能很容易,但我无法弄清楚:(

4

5 回答 5

1

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

如果您需要更多选项,请查看手册。

于 2012-05-14T15:08:51.920 回答
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 中加载时,您需要进行更多的后期处理。

于 2012-05-14T15:12:00.917 回答
0

类文件中查看ProtectionDomain

于 2012-05-14T15:12:49.130 回答
0

尝试:

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

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

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

于 2012-05-14T15:13:54.153 回答
0
  1. 使用 log4j 系统属性指定,在命令的“-jar”部分之前添加:-Dlog4j.configuration=/opt/myapp/log4j.xml

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

    -cp /opt/myapp/

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

    字符串路径 = ... ; PropertyConfigurator.configure(路径);

于 2012-05-14T15:16:21.593 回答