使用清单的类路径订单
我正在构建一个应该由java -jar file.jar
运行的应用程序。使用清单的类路径订单
该jar包含一个清单文件,其中allows为运行时设置类路径。
现在我试着添加Class-Path: .
以允许像log4j.xml
这样的配置文件被放置在与jar文件相同的目录中。
这似乎工作正常,如果jar本身不包含这样的文件,但java总是会更喜欢jar中的文件,否则。
有没有一种方法可以使用清单文件到前面类路径中的某些类迫使java先查看该路径之前查看该jar?
(这样我可以有罐子里面默认的配置,但我将能够通过放置在下一个自定义配置文件,以罐子重写。)
(这样我可以有一个默认配置在jar里面,但我可以通过在jar旁边放置一个自定义配置文件来覆盖该配置。)
最安全的方法是使Log4J配置步骤明确您的main
方法的顶部,检查是否config文件存在并加载合适的配置(使用非默认名称,例如, 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"));
}
}
注:
- 不能使用-cp和罐子在同一时间。当使用的罐子,-cp 将被忽略
- Class.getResource()将寻找相对 包目录,使用资源/在classpath中搜索
我知道'-cp'选项。但我真的会避免编写一个包装脚本。我希望只是创建一个“可点击”的jar文件。 (并且指定清单中的类路径,几乎是正确的。) – michas 2014-09-04 12:53:15
它看起来像预先考虑到类路径不可能在清单中。因此需要一些显式代码来执行查找配置文件等操作。 – michas 2014-09-04 18:54:23