如何将log4j.properties文件移出jar包?

12

我使用Gradle构建了一个jar文件,我的应用程序使用log4j。最初,我的log4j.properties文件嵌入在我的jar文件中。为了能够在生产环境中修改它,我将其移动到了外部。我更新了嵌入在我的jar文件中的META-INF/MANIFEST.MF文件以反映这一点:

Class-Path: lib/log4j-1.2.1 lib/slf4j-api-1.4.2.jar
            lib/slf4j-api-1.5.6.jar lib/slf4j-log4j12-1.5.6.jar
            lib/log4j-1.2.14.jar
            ...
            lib/log4j.properties

我的文件树在Windows7 32位系统中如下:

root/myapp.jar
root/lib/log4j.properties

我用这个命令启动我的应用程序:

java -Dlog4j.configuration='lib\log4j.properties' -Dlog4j.debug=true -jar myapp.jar > logs/output.log

我的logs/output.log显示log4j无法找到其属性文件:

log4j: Trying to find ['lib\log4j.properties'] using context classloader sun.misc.Launcher$AppClassLoader@17fa65e.
log4j: Trying to find ['lib\log4j.properties'] using sun.misc.Launcher$AppClassLoader@17fa65e class loader.
log4j: Trying to find ['lib\log4j.properties'] using ClassLoader.getSystemResource().
log4j: Could not find resource: ['lib\log4j.properties'].

我也尝试了以下方法:

-Dlog4j.configuration='lib/log4j.properties'
-Dlog4j.configuration='log4j.properties'
-Dlog4j.configuration=log4j.properties

当我将文件嵌入jar包中时,它能够正常工作:

log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@18385e3.
log4j: Using URL [jar:file:/C:/Users/User/Desktop/myapp/myapp.jar!/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL jar:file:/C:/Users/User/Desktop/myapp/myapp-2.1.9.jar!/log4j.properties
log4j: Parsing for [root] with value=[debug, A].

但我需要在室外使用...有什么想法吗?


由于jar文件只是一个zip归档文件,大多数压缩/解压程序都可以让您编辑jar文件中的文本文件。 - C J
1个回答

10

试一试:

-Dlog4j.configuration=file:lib/log4j.properties

但我很好奇:manifest中的Class-Path定义真的有效吗?对于Jars来说是标准的,但对于log4j.properties呢?


file: 前缀是有效的。我不知道 log4j.properties 是否支持 Class-path 定义,这是我的原始问题 :-) - m-ric
1
说实话,我从未尝试过Class-Path路线。Oracle文档https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html仅介绍了Class-Path头中的JAR文件。您需要像类路径中的lib目录一样的东西。我在这里尝试了一个虚拟项目,但无法使其正常工作。 - wallenborn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接