jar包路徑問題

開發完畢後,我們經常會將我們的程序打包成可運行jar文件,或者是war包。如果程序內部需要明確知道當前jar包所處的位置,下面是幾種方法:



獲取JAR包路徑和所在目錄的幾種方法

之前轉過一篇文章(讀取jar包中資源文件的幾個方法),詳細介紹瞭如何讀取保存在jar包內的資源文件。今天又遇到個問題,如何定位jar包所在位置呢?比如要輸出錯誤日誌到jar包的同級目錄時,我們就需要知道jar包存放的目錄。衆所周知,未打包的.class文件獲取當前目錄很容易,但是打包成.jar文件就迥然不同了

搜來搜去,找到兩個辦法:

方法一:使用類路徑

String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath()

這種方法可以得到當前程序jar文件的絕對路徑(字符串值)。如果以被打成jar包,調用getFile()或調用getPath()得到的結果是相同的,均爲 the/path/to/abc.jar 的形式。然而如果是class文件的話,兩個方法調用返回的是不同的結果,這裏不多做解釋。
使用該方法得到的字符串是定位到jar文件的,如果想只得到jar文件所在目錄,那麼需要對該字符串再做處理,或者在getLocation()方法返回的URL上作處理。另外注意,如果路徑包含Unicode字符(漢字),那麼還需要使用 java.net.URLDecoder.decode(path, “UTF-8″) 方法進行轉碼,其中path是需要轉碼的字符串路徑。

方法二:使用JVM屬性

String path = System.getProperty("java.class.path")

這裏使用了java運行時的系統屬性來得到jar文件的位置,結果同1方法大致相同,且不需要做轉碼處理。 更多系統屬性參見Oracle的說明。在使用class測試時,該方法得到的路徑爲 “類庫路徑:當前class路徑”(Windows系統應該顯示”類庫路徑;當前class路徑”),然而運行jar包時只會得到我期望的jar包路徑,這一點有點不解。

從jar包路徑的到jar包的目錄,我的方法是:


int firstIndex = path.lastIndexOf(System.getProperty("path.separator"))+1
int lastIndex = path.lastIndexOf(File.separator) +1;
path = path.substring(firstIndex, lastIndex);

當然,如果是採用方法一,就不需要計算firstIndex了。

另外爲了掃盲,註明下面這寫忽悠人的錯誤做法(摘自http://shallway.net/blog/?p=136):

  1.         print(Thread.currentThread().getContextClassLoader().getResource(“”));
  2.         print(CurrentDirectory.class.getClassLoader().getResource(“”));
  3.         print(ClassLoader.getSystemResource(“”));
  4.         print(CurrentDirectory.class.getResource(“”));
  5.         print(CurrentDirectory.class.getResource(“/”));
  6.         print(new File(“”).getAbsolutePath());
  7.         print(System.getProperty(“user.dir”));

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章