【问题标题】:Classpath order using manifest使用清单的类路径顺序
【发布时间】:2014-10-29 02:36:46
【问题描述】:

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

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

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

如果 jar 本身不包含这样的文件,这似乎可以正常工作,但 java 将始终更喜欢 jar 中的文件。

有没有办法使用清单文件在类路径中预先添加一些类,以强制 java 在查看 jar 之前先查看该路径?

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

【问题讨论】:

  • 看起来在清单中不可能预先添加到类路径。因此需要一些显式代码来执行诸如查找配置文件之类的操作。

标签: java jar log4j classpath


【解决方案1】:

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

最安全的方法可能是在 main 方法的顶部明确显示 Log4J 配置步骤,检查配置文件是否存在并加载合适的配置(使用非默认名称,例如 @987654322 @) 如果没有,则从 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);

(为清楚起见省略了异常处理)。

【讨论】:

  • 也许这确实是最安全的方式。您能否添加相应的代码或指向正确文档的链接?
  • @michas 是这样的吗?
【解决方案2】:

我不认为你可以同时拥有它。您将不得不更改调用主类的方式。

例如: 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() 将查找相对于 包目录,使用/在类路径中搜索

【讨论】:

  • 我知道-cp 选项。但我真的会避免编写包装脚本。我希望只是创建一个“可点击”的 jar 文件。 (并在清单中指定类路径,几乎可以做正确的事情。)
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2010-10-22
  • 2018-04-10
  • 2011-08-18
相关资源
最近更新 更多