2012-01-27 20 views
8

我已經打破我的頭在這個相當長的一段時間了,並不能找到這個問題的解決方案:文件和bundleresource://網址

我有一個使用打包成一個自定義庫的Eclipse RCP應用程序罐。從插件中,我正在調用jar中的一個方法。 在此方法中,我使用this.class.getResource(relPath)「獲取」資源,而relPath是我需要的文件的硬編碼相對路徑。這返回我URL,我可以用它來構建一個File

現在,如果我不是從插件調用此方法,而是從簡單的Java程序調用此方法,則此功能完美。 區別:Eclipse RCP的類加載程序返回URL協議bundleresource://File不支持協議,但是當運行簡單的Java程序時,會返回一個file:// -URL,這對構造File來說是完全正常的。

我意識到Eclipse SDK的FileLocator -class(它將bundleresource-URL解析爲文件URL),但我不能在庫中使用它,因爲我不想將它綁定到Eclipse RCP平臺 - 它應該可以從非Eclipse-RCP源使用這個庫。

任何關於如何從相對路徑加載此資源的任何想法,可以在從Eclipse RCP-Plugin或任何其他客戶端調用方法時使用這種方式?

我需要在這個相對路徑的目錄上構建一個File來搜索其中的文件。我完全被卡住這個...

UPDATE:如果有比使用File#list()取得目錄內容,這將幫助已經等我一個可能性..

不勝感激任何提示,

+0

你能列出相關的代碼? – 2012-01-28 11:35:49

+0

@TonnyMadsen嗯,我可以但基本上非常簡單:我使用this.getClass()。getResource(relPath)在我的classPath中加載路徑。這會在Eclipse RCP下完成時返回一個bundleresource:// URL,否則返回file:// URL。 嘗試創建文件對象失敗,因爲文件不支持此協議,因此bundleresource:// URL。 由於我需要閱讀「relPath」的目錄內容,我不得不使用文件... – quaylar 2012-01-30 07:34:19

+0

如何將URL轉換爲文件? – 2012-01-30 07:42:52

回答

12

難道你不能簡單地顛倒依賴。即,你的模塊,其獲取資源的URL定義接口

interface Locator { URL resolve(URL url); } 

,你可以使用默認的實現

class StandaloneLocator implements Locator { 
    public URL resolve(URL url) { return url; } 
} 

在Eclipse的情況下,這個默認定位器是由

class EclipseLocator implements Locator { 
    public URL resolve(URL url) { return FileLocator.resolve(url); } 
} 
被替換

現在,您的庫對Eclipse沒有依賴關係,並且仍然可以使用FileLocator。既然你不會得到任何bundleresource-URL的Eclipse,這應該工作。

乾杯, 延

+0

我已經在回答之前就已經繞過了這個問題,但這真是個好主意!欣賞它,並可能在下次重構它:) – quaylar 2012-02-28 08:42:49

0

無法使用Class中的方法枚舉jar文件中的文件。您需要創建包含所有資源名稱的resourcelist文件,或打開zip文件之類的jar文件並枚舉zip文件中的文件。 File類不能處理file://以外的協議。如果您的資源是jar文件,則應使用Url類,並使用Url.openSteram方法獲取文件內容。

UPD關於運行簡單的java應用程序:您可能不會將它打包到jar文件中,因此您的類和資源將放置在文件系統中而不存檔。這就是爲什麼你得到file://協議。如果你打包成jar文件,協議將不會是file://它將是jar://(不確定確切的協議名稱)。

+0

欣賞您的答案,但文件/資源​​不在jar中,而是在應用程序的類路徑中的目錄中。 關於Url.openStream():不幸的是不能使用這種方法讀取目錄內容(我需要加載一個目錄作爲資源並檢查現有文件)。 – quaylar 2012-01-30 07:30:44