2011-03-21 124 views
7

我需要複製一個文件夾,打包在運行時的Jar中。我想通過調用一個包含在同一個文件夾中的類中的函數來完成它。如何從JAR中提取文件夾

我一直在使用getSystemResource嘗試:

URL sourceDirUrl = ClassLoader.getSystemResource("sourceDirName"); 
File sourceDir = new File(sourceDirUrl.toURI()); 

,但它不工作。 我可能必須遞歸使用getResourceAsStream函數。有沒有更優雅的/跨海大道的方式來做到這一點?

如果我必須遞歸執行: 1.我不想指定硬編碼的文件,我想動態地執行它 2.我不想創建單獨的歸檔文件。我想這個資源是在同一個JAR的類和它打交道

感謝

最後我做什麼Koziołek以下建議。雖然我希望有一個更優雅的解決方案,但看起來這樣的效果還是不錯的。

+0

你給'sourceDirName'作爲完整路徑嗎? – Nishant 2011-03-21 11:44:29

+0

是的,請舉例說明你使用的'sourceDirName'。 – asgs 2011-03-21 11:46:12

+0

@Nishant - 不,相對路徑,第一行有效,URL正確,但是根據這個URL創建一個File對象是不可能的,因爲這個文件夾在歸檔中 – 2011-03-21 11:50:04

回答

2

Jar是簡單的ZIP文件。您可以使用java.util.zip。*包到decompress文件。

+0

這樣,jar的位置需要在應用程序中進行硬編碼。 – greydet 2011-03-21 12:03:02

+1

nope ...你可以使用getResource類似的方法來獲取jar的位置。 – 2011-03-21 12:09:16

+0

我很想知道如何通過類加載器中的getResource方法這樣簡單的方法來實現這一點,並考慮jar包的所有可能情況。 – greydet 2011-03-21 12:21:55

5

使用類加載器無法檢索文件夾,因爲它不能作爲類路徑的資源。

幾種解決方案是可能的:

  • 使用ClassLoader的getResource方法,通過一個檢索您的文件夾中的所有資源,如果你事先知道你要查找的文件名。
  • 將您的完整文件夾打包到您可以使用上一個方法從類加載器中檢索的存檔中。
  • 直接解壓縮您的jar以檢索包含的文件夾。它需要從文件系統中知道jar的精確位置。這並不總是可能的,這取決於應用程序並且不可移植。

我會優先考慮更便攜和靈活的第二種解決方案,但需要重新包裝文件夾內容的所有修改。

+0

1.我不想指定硬編碼的文件,我想動態地執行它 2.我不想創建單獨的存檔。我希望這個資源與處理它的類處於同一個Jar中 – 2011-03-21 11:59:23

+0

這就是爲什麼我更喜歡第二個建議的解決方案;) – greydet 2011-03-21 12:01:16