我正在使用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的位置)?
可能非常容易,但我无法弄明白:(
答案 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)
使用log4j系统属性指定,在命令的“-jar”部分之前添加: -Dlog4j.configuration = /选择/ MyApp的/的log4j.xml
将目录添加到类路径中,在命令的“-jar”部分之前添加:
-cp / opt / myapp /
您可以在代码中手动指定log4j.xml文件,然后相对于您的jar文件引用它。
String path = ...; PropertyConfigurator.configure(路径);