2011-08-22 160 views
3

我剛剛發佈了這個問題:How to distribute my Java program so that it is runnable by double-clicking a single file?雖然我得到了可運行jar工作,但很多事情並不按照我希望他們的方式工作,因爲我的程序找不到我想要使用的資源,如圖像和SQLite數據庫文件。如何訪問可運行jar內的應用程序資源?

在我的文件系統,我在IMG文件夾位於一個名爲test.db的

項目的根文件夾在我的項目是Eclipse的一個數據庫中的幾個。PNG圖像,我使用類似訪問我的圖片:

BufferedImage bufImg = ImageIO.read(new File("img/anImage.png")) 

我使用連接到我的SQLite數據庫:

Class.forName("org.sqlite.JDBC"); 
conn = DriverManager.getConnection("jdbc:sqlite:test.db"); 

現在,當我雙擊我的新創建的可運行-JAR,資源不能被發現。我想知道我應該如何訪問它們,並讓程序在不在IDE中時工作。

我還想知道如何查看例外情況(如果可能的話)。因爲現在有些頁面保持灰色,因爲它們沒有加載,因爲(我猜測)某些資源找不到,但我不知道是否只有數據庫導致問題,或者它也是圖像。

非常感謝,很抱歉在如此短的時間內提出兩個相關問題!

+0

*「對不起,問了兩個相關問題,在如此小的時間表!」 *他們都是很好的問題,所以我不能接受你的道歉 - 我只會投票。 –

回答

5

Jar中沒有文件,只有資源,所以大多數使用文件的方法也會接受資源。

例如,ImageIO.read(...)有一個接受URL的重載和一個接受InputStream的重載。因此,嘗試

BufferedImage bufImg = ImageIO.read(MyClass.class. 
     getResourceAsStream("img/anImage.png")); 

只是一定要使用相對路徑的類文件的位置和你的實際的類名,或this.getClass()

+0

我明白了,我會試試看看它是如何工作的。但是,只是一個問題:即使我的應用程序不在jar中,資源方法是否也能工作?如果他們這樣做,我不明白爲什麼應該使用文件版本,因爲它將在您將它放入一個jar時破壞?另外,如何訪問沒有方法可以作爲資源訪問它們的文件? –

+0

是的,資源版本應該適用於非jar類。資源的主要限制是*只讀*,文件沒有這個限制。關於訪問文件沒有方法,允許資源 - 我不能回答這個普遍的問題。記住有一個具體的例子嗎? –

+0

我不這麼認爲,如果我將來遇到過一個,我只是不想被卡住......隨着你最後的評論「資源的主要侷限性是隻讀」,我有一些東西不完全理解,但是...如果資源是隻讀的,這是否意味着我將無法將我的SQLite數據庫文件放入JAR文件中,因爲我想要在其中寫入一些新行當我在應用程序中獲取新數據時?使用jar外部的絕對路徑訪問文件會更好嗎? –

相關問題