2014-09-04 69 views
0

我正在构建一个应该由java -jar file.jar运行的应用程序。使用清单的类路径订单

该jar包含一个清单文件,其中allows为运行时设置类路径。

现在我试着添加Class-Path: .以允许像log4j.xml这样的配置文件被放置在与jar文件相同的目录中。

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

有没有一种方法可以使用清单文件到前面类路径中的某些类迫使java先查看该路径之前查看该jar?

(这样我可以有罐子里面默认的配置,但我将能够通过放置在下一个自定义配置文件,以罐子重写。)

+0

它看起来像预先考虑到类路径不可能在清单中。因此需要一些显式代码来执行查找配置文件等操作。 – michas 2014-09-04 18:54:23

回答

1

(这样我可以有一个默认配置在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); 

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

+0

也许这确实是最安全的方法。您能否请添加相应的代码或链接到正确的文档? – michas 2014-09-04 17:26:12

+0

@michas是这样的吗? – 2014-09-04 17:30:44

+0

Perfekt。谢谢。 – michas 2014-09-05 08:42:40

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和罐子在同一时间。当使用的罐子,-cp 将被忽略
  2. Class.getResource()将寻找相对 包目录,使用资源/在classpath中搜索
+0

我知道'-cp'选项。但我真的会避免编写一个包装脚本。我希望只是创建一个“可点击”的jar文件。 (并且指定清单中的类路径,几乎是正确的。) – michas 2014-09-04 12:53:15