2014-09-04 124 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