2010-11-06 69 views
1

我創建簡單的庫AppInfo提供一種簡單的方法來顯示關於在Java應用程序的版本上運行的軟件,這是從CI服務器自動構建結合特別有用總是有效的,自動更新的信息。如何獲取從桌面應用程序運行的JAR的名稱?

在我的圖書館,有必要從JAR(在桌面應用程序的情況下)讀取MANIFEST.MF這是從(不是從任何其他的類路徑)結束應用程序運行。目前我使用基於一個想法,採取形式Sun的論壇(該鏈接不工作了)一個解決方案:

String classContainer = classFromRightJar.getProtectionDomain().getCodeSource().getLocation().toString(); 
URL manifestUrl = new URL("jar:" + classContainer + "!/META-INF/MANIFEST.MF"); 

和一般的作品,但它迫使一個桌面應用程序的開發人員創建一個配置的附加豆位於特定JAR中的類的名稱。

有沒有更好的/通用的解決方案,它提供了一個名稱/位置/ MANIFEST.MF的/從JAR是從桌面應用程序運行?

感謝您的幫助
馬辛

回答

0

通過「桌面應用程序的力量開發人員可以創建額外的豆腐......」你的意思是你不希望他們曾經有任何引用其應用的的班級名稱?如果是這樣,那麼可能沒有任何100%可靠的方法,但一種方法可能是調用java.awt.Frame.getFrames()並檢查JFrame的非java *子類。例如: -

for (Frame frame in Frame.getFrames()) { 
    if (frame.getClass().getPackage().getName().startsWith("java")) 
     continue; 
    URL manifestURL = frame.getClass().getResource("/META-INF/MANIFEST.MF"); 
    // do something with the manifest 
} 

這將打破,如果應用程序沒有繼承JFrame /幀自己,所以你可能也想通過框架的孩子走路去檢查孩子的亞類。

另一種方法可能是抓住Thread.getAllStackTraces()並遍歷所有它們(特別是「主」線程),查找啓動應用程序的主類,然後獲取該類的清單。

正如我說的,雖然有可能是沒有做任何100%可靠的方法,因爲應用程序可能無法使用任何自定義子類和線程堆棧可能有不同的應用的混合物。

+0

想法是創造其連接和工作的圖書館。我擔心是否有辦法以可靠的方式做到這一點。我可能會強迫最終應用程序開發人員使用主存檔中的名稱(+包)類創建一個String bean。它仍然很容易做,更安全。感謝您的回答。順便說一下,堆棧跟蹤很好的破解。 – 2010-11-09 21:58:17

2

有一個系統屬性「sun.java.command」包含兩種罐子名或類名加上所有的main()方法的參數。因此,對於調用

java -jar test.jar arg1 arg2 

你會得到 「Test.jar的ARG1 ARG2」 和

java test.Test arg1 arg2 

屬性值將是 「test.Test ARG1 ARG2」。 正如該屬性的名稱所暗示的那樣,它不是「官方」(不必在非Sun/Oracle實施中工作)。我在Java 7上進行了檢查,不知道它何時推出。

相關問題