使用清单的类路径顺序

时间:2014-09-04 11:05:55

标签: java jar log4j classpath

我正在构建一个应该由java -jar file.jar运行的应用程序。

jar包含一个清单文件,allows用于设置运行时的类路径。

现在我尝试添加Class-Path: .以允许将log4j.xml之类的配置文件放在与jar文件相同的目录中。

如果jar本身不包含这样的文件,这似乎工作正常,但java总是更喜欢jar中的文件。

有没有办法在类路径中使用清单文件 prepend 某些类来强制java在查看jar内部之前首先查看该路径?

(这样我可以在jar中有一个默认配置,但我可以通过在jar旁边放置一个自定义配置文件来覆盖它。)

2 个答案:

答案 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"));
    }
}

注意:

  1. 您不能同时使用-cp和-jar。使用-jar时,-cp 将被忽略
  2. Class.getResource()将查找相对于的资源 包目录,使用/在类路径中搜索