2009-04-14 37 views
15

我知道我們可以做這樣的事情:如何遍歷Java類資源?

Class.class.getResourceAsStream("/com/youcompany/yourapp/module/someresource.conf") 

來讀取包裝我們的jar文件中的文件。

我已經Google了很多,我肯定沒有使用適當的條款;我想要做的是列出可用的資源,這樣的事情:

Class.class.listResources("/com/yourcompany/yourapp") 

這應該返回的包com.yourcompany.yourapp.*

內部的資源列表,可以嗎?任何想法如何做到這一點,以防止它不能像我所顯示的那樣輕鬆完成?

注意:我知道可以知道你的jar在哪裏,然後打開它並檢查它的內容來實現它。但是,我現在所處的環境中無法做到這一點。

+0

就像ServiceLoader的一個選項? http://stackoverflow.com/questions/251336也就是說,不是在運行時在類路徑中列出「目錄」,而是在編譯時顯式提供資源列表,並將其存儲在熟悉位置的類路徑中。 – erickson 2009-04-14 23:30:50

回答

9

對於一個JAR文件的資源,像這樣的工作:

URL url = MyClass.class.getResource("MyClass.class"); 
String scheme = url.getProtocol(); 
if (!"jar".equals(scheme)) 
    throw new IllegalArgumentException("Unsupported scheme: " + scheme); 
JarURLConnection con = (JarURLConnection) url.openConnection(); 
JarFile archive = con.getJarFile(); 
/* Search for the entries you care about. */ 
Enumeration<JarEntry> entries = archive.entries(); 
while (entries.hasMoreElements()) { 
    JarEntry entry = entries.nextElement(); 
    if (entry.getName().startsWith("com/y/app/")) { 
    ... 
    } 
} 

你可以做同樣的事情與資源「爆炸」的文件系統上,或者在其他許多存儲庫中,但並不那麼容易。您需要爲您想要支持的每個URL方案指定特定的代碼。

0

我通常使用

getClass().getClassLoader().getResourceAsStream(...) 

,但我懷疑,你可以列出從classpath中的條目,不知道他們的先驗。

+0

您能否請您參考一下,指出您所說的事實? – 2009-04-14 22:07:39

2

我一直在尋找一種方法來列出使用類加載器的jar文件的內容,但不幸的是這似乎是不可能的。相反,你可以做的是打開jar作爲zip文件並以這種方式獲取內容。您可以使用標準(here)方法來讀取jar文件的內容,然後使用classloader來讀取內容。

4

一般無法獲得這樣的資源列表。有些類加載器甚至可能不支持來支持這一點 - 設想一個類加載器可以從Web服務器獲取單個文件,但Web服務器不必支持列出目錄的內容。 對於jar文件,當然可以顯式加載jar文件的內容。

This question是相似的,順便說一句。)

+0

這將是很好理解爲什麼類加載器不允許它或爲什麼jre不提供一個簡單的方法來做到這一點:( – 2009-04-14 22:59:18

+0

@大衛:我舉了一個例子,爲什麼它不總是可行的 - 情況下,唯一的訪問你在底層商店(網絡)的「獲取這個文件」 – 2009-04-15 05:21:22