[英]Classpath order using manifest
我正在构建应由java -jar file.jar
运行的应用程序。
该jar包含清单文件,该清单文件允许设置运行时的类路径。
现在,我尝试添加Class-Path: .
为了允许将诸如log4j.xml
类的配置文件放置在与jar文件相同的目录中。
如果jar本身不包含这样的文件,这似乎可以正常工作,但是java总是会优先选择jar内的文件。
有没有办法使用清单文件中预先准备一些类在classpath迫使Java来在这条道路首先要看瓶子里面找以前的方法吗?
(通过这种方式,我可以在jar内有一个默认配置,但是我可以通过在jar旁边放置一个自定义配置文件来覆盖它。)
(通过这种方式,我可以在jar内有一个默认配置,但是我可以通过在jar旁边放置一个自定义配置文件来覆盖它。)
最安全的方法可能是在main
方法的顶部明确显示Log4J配置步骤,检查配置文件是否存在并加载合适的配置(使用非默认名称,例如com/mypackage/default-log4j.xml
),如果不是的话。 将日志记录配置文件放在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);
(为清楚起见,省略了异常处理)。
我认为您不能同时拥有这两种方式。 您将不得不更改如何调用主类。
例如: 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"));
}
}
笔记:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.