2010-07-22 100 views
2

我的項目設置的Java:從文件系統

加載資源,我有以下項目設置:

\program.jar 
\images\logo.png 

在我的代碼,我引用圖像與相對URL "images/logo.png"

問題

如果我運行這個程序用下面的命令,而在目錄:

c:\projects\program_dir\bin\>java -jar program.jar 

然後一切工作和Java是能夠找到的圖像。

現在,我的問題是,我需要能夠從不同的目錄中運行程序。

c:\>java -jar c:\projects\program_dir\bin\program.jar 

該程序已執行,但現在所有相對URL都不再有效。

我需要什麼

如何計算program.jar文件的執行回家,這樣我可以改變我的相對URL爲絕對URL?

回答

9

我會做什麼,如果可能的話,是用你的罐子包裝你的圖像。

這樣你就不必擔心你的Jar從哪裏啓動。

你會那麼需要類似的圖像加載到以下幾點:

InputStream stream = this.getClass().getClassLoader(). 
            getResourceAsStream("/images/logo.png"); 
+0

+1利用類路徑加載靜態資源。 另請參閱:http://stackoverflow.com/questions/861500/url-to-load-resources-from-the-classpath-in-java,http://stackoverflow.com/questions/3294196/load-resource -from-anywhere-in-classpath,http://stackoverflow.com/questions/1900154/classpath-resource-within-jar – 2010-07-22 13:09:55

0

資源必須在類路徑(S)。您可以嘗試以下其中一種方法:

  1. 將圖像放入program.jar
  2. 和大多數的程序一樣,它們有一個APP_HOME目錄,例如, MAVEN_HOME,註冊並將您的文件稱爲File而不是 - $APP_HOME/the-file.ext(與System.getenv())。
1

你應該真的把你的資源包含在你的JAR中。

如果失敗,則可以解析出主類資源的絕對路徑。假設你的主類實際上是所謂的「主」:

Main.class.getResource("Main.class").getPath(); 
0

正如尼爾森所提到的,包將它們與JAR(只是複製他們旁邊的.class文件),那麼你可以通過一個簡單的this.getClass().getClassLoder().getResource("images/foo.png")找到它們。

0

您需要添加一個描述類路徑的參數。應該是這個樣子

java -cp c:\projects\program_dir\bin -jar program.jar 

這將會把你的罐子和圖像類路徑上,它會成功加載。

+0

這實際上是錯誤的([java documentation](http://docs.oracle.com/javase) /7/docs/technotes/tools/solaris/java.html)): '-jar當您使用此選項時,JAR文件是所有用戶類的來源,並且其他用戶類路徑設置將被忽略。 – nachteil 2016-01-12 12:56:28