2010-04-14 194 views
9

我有一個jar文件,其中包含我想分發的資源(主要是用於緩存,日誌記錄等的配置)。訪問JAR資源

我在使用這些資源的相對路徑的問題,所以我做了什麼,我在另一個計算器問題,其表示,這是一個有效的辦法已經找到:

ClassInTheSamePackageOfTheResource.class.getResourceAsStream('resource.xml'); 

可悲的是這並不行。

任何想法?謝謝!

PS:很明顯,我不能使用絕對路徑 ,我想避免 環境變量如果可能的話

+0

資源文件與類文件位於同一文件夾中嗎?這是一個獨立的應用程序還是在Web服務器上運行? – kgiannakakis 2010-04-14 18:28:12

+0

確實在同一個文件夾中。它是一個包含在Web應用程序中的jar,是的(但我認爲它應該是無關緊要的) – 2010-04-14 18:34:21

+2

它與搜索與給定類關聯的資源的規則是由定義的類加載器實現的。因此,基於實現,您的Web應用程序的類加載器的行爲可能會稍有不同。只是一個想法。 – 2010-04-14 18:38:26

回答

11

確保您的資源文件夾在項目設置中列爲源文件夾。另外,確保在構建jar時將資源文件夾設置爲導出。

您可以向jar文件中添加一個.zip擴展名,然後將其打開,以確保您的資源包含在預期的位置。

我總是使用絕對路徑是這樣的:

InputStream input = this.getClass().getResourceAsStream("/image.gif"); 

當您使用絕對路徑,「/」是jar文件的根文件夾,而不是主機的根文件夾。

+4

爲+1注意/是jar的根文件夾。 – Powerlord 2010-04-14 18:53:57

+0

的確,我使用了你描述的(jar)絕對路徑方法,它的工作原理!不知道爲什麼它沒有與相關的技巧做到這一點......但足夠好就足夠了 – 2010-04-14 18:56:57

1

我總是通過getResourceAsStream困擾,使這項工作。如果 「resource.xml」 是org/pablo/opus,我認爲你想這樣的:

Name.class.getResourceAsStream("org.pablo.opus.resource.xml"); 
1

其中resource.xml發現的?如果在源代碼樹的根目錄中,嘗試用/作爲前綴。

+0

它不在源代碼樹的根目錄下。它位於包 – 2010-04-14 18:41:11

+1

中,因此將完全限定的名稱視爲絕對路徑,例如com.me.and.u.effects.css將作爲/com/me/and/u/effects.css進行訪問, – Seffi 2010-04-14 18:50:27

1

我通常存儲文件和其他資源,然後檢索它們作爲網址:

URL url = MyClass.class.getResource("/design/someResource.png"); 

在靜態情況下,或以其他方式:

URL url = getClass().getResource("/design/someResource.png"); 

從一個實例。

上面的代碼片段假定設計是jar中的頂級文件夾。一般來說,如果路徑以「/」開始,它將採用絕對路徑,否則它與班級位置是相對的。