2012-05-03 65 views
11

我曾經在https://stackoverflow.com/a/5893391/14731發現說明添加到Class-Path的屬性的任意條目。這裏是我的MANIFEST.MF文件:可執行的JAR忽略了自己的類路徑屬性

Manifest-Version: 1.0 
Class-Path: jace-runtime.jar 
Main-Class: org.jace.examples.Test 

我定義org.jace.examples.Test如下:

public class Test 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("classpath: " + System.getProperty("java.class.path")); 
     System.out.println("PeerExample: " + Class.forName("org.jace.util.ShutdownHook")); 
    } 
} 

其中org.jace.util.ShutdownHookjace-runtime.jar定義。當我調用java -jar peer_example1.jar我得到以下的輸出:在線程「主要」拋出java.lang.ClassNotFoundException

classpath: peer_example1.jar 例外:org.jace.util.ShutdownHook

換句話說,Java正在添加可執行的JAR文件到類路徑但忽略Class-Path。如果我調用java -cp jace-runtime.jar;peer_example1.jar org.jace.examples.Test我得到預期的輸出:

classpath: jace-runtime.jar;peer_example1.jar

任何想法?

+0

如果jar根被認爲是當前工作目錄,您可能需要../jace-runtime.jar。 –

+0

@MarkoTopolnik:我剛試過。它沒有工作。 – Gili

+2

但你試圖在其他jar訪問類?看起來,java.class.path並不反映從清單中讀入的類路徑。 –

回答

12

回答我的問題:

  1. 將任意條目Class-Path是自身的罰款。

    <configuration> 
        <archive> 
        <index>true</index> 
        </archive> 
    </configuration> 
    

    Maven會從META-INF/INDEX.LIST省去您的條目:當您啓用使用JAR索引,就會出現問題。

  2. 當您在運行時使用的JAR,Java將看INDEX.LIST尋找類,而不是MANIFEST.MF。

  3. 因爲您的條目從INDEX.LIST失蹤,他們將不會被發現的類加載器,不管清單說什麼。

一個簡單的解決方法是禁用JAR索引。我不知道如何啓用索引注入任意Class-Path

-3

每tooldocs頁的jar選項 - Link to docs

當您使用此選項,JAR文件是所有用戶類的源,和其他用戶類路徑設置將被忽略。

+1

-1:該文檔涉及到'-cp/-classpath'命令行選項被我忽略,因爲我正在使用'Class-Path',所以這不是問題。 – Gili

0

對於那些可能不知道的人,可執行檔案機制採用清單類路徑並使用它來將類外部加載到檔案。

因此,如果您期待帶有WEB-INF/classes清單類路徑的WAR來找到WEB-INF/classes條目檔案中的類,那麼您將會感到失望。