繁体   English   中英

使用清单的类路径顺序

[英]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"));
    }
}

笔记:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM