2011-04-16 137 views
0

我試圖以編程方式查找它運行時的jar文件的完整路徑。我知道有一些關於這個其他問題,但沒有人似乎爲我工作 - 最明顯的是,我經歷了如何找到正在運行的jar文件的路徑

MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().g­etPath() 

絆倒多次。在Eclipse中調試時,該特定的方法適用於我,但是一旦我編譯到jar,它就會返回一個NullPointerException。其他方法在編譯後遇到了類似的問題。

我有一個使用java.class.path的臨時解決方法,但是當我從GUI執行jar時,它只返回完整路徑 - 在終端中,它失敗。

我還應該注意,我遇到這個問題的唯一系統是Linux。在Windows和Mac上,我沒有麻煩。

任何幫助將不勝感激:)

謝謝!

德里克

編輯:罐子是可執行的,如果改變任何東西。

回答

2

你不能這樣做。 ClassLoaders不需要支持這個,大多數不支持。

或者,這個表述可能會更有幫助。二進制類通過ClassLoader對象進入JVM。對象不需要跟蹤它們加載的類的出處。他們可以從任何地方加載它們:一個罐子,一個網絡,一個數據庫,一箇舊罐子。因此,如果您想要始終知道應用程序中類的出處,則必須始終使用類加載器加載代碼,而實際上,它確實能夠以對您有用的方式跟蹤源代碼。

如果你控制整個應用程序,你可以這樣做。

如果你不控制整個應用程序,而是在討論任意應用程序中加載到任意類加載器的任意jar,那麼你不能依靠學習它的位置。

+0

非常感謝!這是很好的知道。 另一個注意事項,如果它改變任何東西 - 我忘了提及這是一個可執行的jar文件。 – 2011-04-16 18:14:15

+0

如果您確定,那麼系統屬性java.class.path就是您的朋友。你的班級在那裏。 – bmargulies 2011-04-16 18:21:17

2

從一個jar文件運行,即使下面的工作對我來說:

URL url = this.getClass().getProtectionDomain().getCodeSource().getLocation(); 
String p = URLDecoder.decode(url.getFile(), "UTF-8"); 
File jarFile = new File(p); 

發送通過URLDecoder的路徑是重要的,因爲如果該目錄包含空格,否則在它%20一個路徑將被創建。

+0

試過這個,但仍然有NullPointerException。不管怎麼說,多謝拉! – 2011-04-16 20:16:36

+0

它對我來說很好用,不知道你的設置有什麼不同 – 2011-04-16 20:35:41

相關問題