我正在构建一个应该由java -jar file.jar
运行的应用程序。
jar包含一个清单文件,allows用于设置运行时的类路径。
现在我尝试添加Class-Path: .
以允许将log4j.xml
之类的配置文件放在与jar文件相同的目录中。
如果jar本身不包含这样的文件,这似乎工作正常,但java总是更喜欢jar中的文件。
有没有办法在类路径中使用清单文件 prepend 某些类来强制java在查看jar内部之前首先查看该路径?
(这样我可以在jar中有一个默认配置,但我可以通过在jar旁边放置一个自定义配置文件来覆盖它。)
答案 0 :(得分:1)
(这样我可以在jar中有一个默认配置,但我可以通过在jar旁边放置一个自定义配置文件来覆盖它。)
最安全的方法可能是在main
方法的顶部显式显示Log4J配置步骤,检查配置文件是否存在并加载合适的配置(使用非默认名称,例如com/mypackage/default-log4j.xml
)来自JAR内部,如果没有。将日志记录配置文件放在JAR中的“默认”位置并不是一个好习惯,因为如果在另一个应用程序的类路径上使用JAR,它可能会产生干扰。
URL logConfig = null;
File xmlFile = new File("log4j.xml");
if(xmlFile.exists()) {
logConfig = xmlFile.toURI().toURL();
} else {
logConfig = MyMainClassName.class.getResource("default-log4j.xml");
}
DOMConfigurator.configure(logConfig);
(为清楚起见省略了异常处理)。
答案 1 :(得分:0)
我认为你不能双管齐下。您将不得不更改如何调用主类。
例如:
java -cp .:file.jar <main-class>
我要测试的示例类是:
package jarmftest;
class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
System.out.println(System.getProperty("java.class.path"));
System.out.println(Main.class.getResource("/test.xml"));
}
}
注意: