我已经构建了一个java应用程序,并且我一直在使用slf4j / log4j进行日志记录。我现在想为用户提供更改日志记录级别的可能性,而无需重新构建.jar文件。
我已经读过这样做,你的属性文件需要在应用程序的类路径中。我已尝试在MANIFEST.MF文件中使用Class-Path标头来实现此目的,但它无效。
这是我尝试的两个例子。
Class-Path:./config/
Class-Path:C:/users/user/directory/tools/config/
然而,这些似乎都没有添加到类路径中,因为我已经尝试在应用程序开始运行后打印其内容。
答案 0 :(得分:0)
正如this question所建议的那样,我最终在java执行命令中添加了一个参数。请记住,如果您像我一样执行bash命令,则需要添加目录的完整路径。
java -Dlog4j.configuration=file:/path/to/log4j.properties -jar myApp.jar
我不喜欢这个,因为它使它非常依赖于路径配置,但它就足够了。
答案 1 :(得分:0)
请在下面找到可能的解决方案列表。
1) java -jar myApp.jar
将按以下顺序搜索log4j.properties
myApp.jar
Class-Path:
myApp.jar
中指定的目录
2) java -Dlog4j.configuration=file://path/to/file//log4j.properties -jar myApp.jar
将使用-Dlog4j.configuration=...
指定的属性文件
3) java -Xbootclasspath/a:../config -jar myApp.jar
将按以下顺序搜索log4j.properties
../config/
myApp.jar
Class-Path:
myApp.jar
中指定的目录
我认为解决方案 1)应解决您的问题,如下面的
log4j.configuration
myApp.jar
Class-Path: config/
编辑可以避免硬编码路径的可能解决方案,但使用log4j.properties
文件的已定义位置可能如下所示。
假设您的应用程序的结构如下
c:\somewhere\myApp.jar
c:\somewhere\config\log4j.properties
c:\somewhere\run_myapp.cmd
<强> run_myapp.cmd 强>
@echo off
... do your necessary preparation here
java -Dlog4j.configuration=file:%~dp0log4j_2.properties -jar myApp.jar
这将始终使用相对于config\log4j.properties
的{{1}}。
myApp.jar
- 扩展为驱动%~pd
使用此解决方案,您的用户需要在给定位置存储属性文件,但不需要更改run_myapp.cmd
脚本。