2012-06-22 33 views
21

我創建了一個可執行jar並使用commons-cli爲用戶提供了在啓動客戶端時指定命令行參數的功能。一切正常。然而,當我打印用法語句罐子,我想顯示如下:從main()方法中獲取可執行jar名稱

usage: java -jar myprog.jar <options> <file> 
--help Display the help message 
--debug Enable debugging 
.... 

的所有選項打印很容易用公地CLI完成。然而,「使用」線是頭部劃痕。我似乎無法找到一種方法從傳遞給應用程序的args []中獲取「myprog.jar」名稱。

有沒有簡單的方法來做到這一點?我可以使用一種非常複雜的方法從我的類的類加載器中取回跟蹤信息,並確定它是否包含在jar中,但對於什麼應該是一個非常簡單的問題,這似乎是一個相當難看的答案。

private String getPath(Class cls) { 
    String cn = cls.getName(); 
    String rn = cn.replace('.', '/') + ".class"; 
    String path = 
      getClass().getClassLoader().getResource(rn).getPath(); 
    int ix = path.indexOf("!"); 
    if(ix >= 0) { 
     return path.substring(0, ix); 
    } else { 
     return path; 
    } 
} 
+0

已嘗試http://stackoverflow.com/questions/320542/how-to-get-the-path-of-a-running-jar-file?lq=1? – Charles

+0

我確實已經看到該鏈接,但它看起來好像也幾乎是「黑客」。我不相信沒有更直接的解決方案。另外,API聲明「getCodeSource()」可能返回null,但沒有詳細說明在哪些條件下,所以我自然想知道這是否是一種「自動防故障」方法。 –

回答

33

在這裏你去:

new java.io.File(SomeClassInYourJar.class.getProtectionDomain() 
    .getCodeSource() 
    .getLocation() 
    .getPath()) 
.getName() 

編輯:我看到你關於getSourceCode API評論。那麼,這可能是你在Java中可以做的最好的。關於getCodeSource()返回null,我認爲它主要發生在java.lang.*以及源位置爲「隱藏」的其他特殊類的類中。應該爲你自己的班級工作。

+0

謝謝 - 這與@Charles在SO鏈接中指出的一樣。正如我上面提到的,我最關心的是getCodeSource()的api表明它可以爲null,但沒有詳細說明在哪些條件下。 –

+0

另一個問題是,它沒有考慮到類文件可能嵌套在檔案中的事實。所以我仍然需要檢查一個'!'子字符串。就像我說的那樣,Java似乎有點笨重,並且對Java沒有更好的解決方案感到非常驚訝。 –

+0

這主要是因爲很少有理由知道您正在運行的jar文件的名稱。功能應該(理想情況下)與名稱無關。 – Charles

相關問題