2012-05-06 37 views
2

首先。我知道,關於如何訪問jar文件中的圖像,已經存在各種主題。其次。我嘗試了很多選擇,沒有一個沒有工作。當然,我知道我犯了一個錯誤。你能幫我理解我做錯了什麼嗎?訪問罐內的圖像

所以,我有名稱'j'的原型項目,它只包含一個Java類 - 客戶端。 客戶端試圖訪問image good.png。在我打包所有可執行jar文件後,客戶端無法訪問文件。 我在日食中工作,並使用螞蟻。

j/ 
-src/ 
--com/ 
---pupcom/ 
----Client.java 
-images/ 
--good.png 
-build.xml 
-.classpath 
-.project 

com.pupcom.Client包含

package com.pupcom; 
//imports; 
public class Client { 
    public static void main(String [] a) { 
     new Client(); 
    } 
    public Client() { 
     URL imageURL = getClass().getClassLoader().getResource("images"+File.separator+"good.png"); 
     if(imageURL != null){ 
      Image image = Toolkit.getDefaultToolkit().getImage(imageURL); 
      if(image != null){ 
       System.out.println("Complete!"); 
      }else{ 
       System.out.println("image == null"); 
      } 
     }else{ 
      System.out.println("imageURL == null"); 
     } 
    } 
} 

的build.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project name="j" basedir="."> 
    <property name="src.dir" value="src"/> 
    <property name="build.dir" value="build"/> 
    <property name="main-class" value="com.pupcom.Client"/> 
    <property name="jar.name" value="j.jar"/> 
    <target name="clean"> 
     <delete dir="${build.dir}"/> 
     <delete file="${jar.name}"/> 
    </target> 
    <target name="compile" depends="clean"> 
     <mkdir dir="${build.dir}"/> 
     <mkdir dir="${build.dir}/images"/> 
     <copy todir="${build.dir}/images"> 
      <fileset dir="images" /> 
     </copy> 
     <javac srcdir="${src.dir}" destdir="${build.dir}" /> 
    </target> 
    <target name="run" depends="jar"> 
      <java jar="${jar.name}" fork="true"/> 
     </target> 
    <target name="jar" depends="compile"> 
     <jar destfile="${jar.name}"> 
      <fileset dir="${build.dir}" /> 
      <manifest> 
       <attribute name="Main-Class" value="${main-class}"/> 
      </manifest> 
     </jar> 
    </target> 
</project> 

我也用這幾行:

URL imageURL = getClass().getClassLoader().getResource(File.separator + "images"+File.separator+"good.PNG"); 
URL imageURL = getClass().getClassLoader().getResource("good.PNG"); 
URL imageURL = getClass().getResource(File.separator + "images"+File.separator+"good.PNG"); 
URL imageURL = getClass().getResource("good.PNG"); 
URL imageURL = Client.class.getResource(File.separator + "images"+File.separator+"good.PNG"); 
URL imageURL = Client.class.getResource("good.PNG"); 
URL imageURL = Client.class.getClassLoader().getResource(File.separator + "images"+File.separator+"good.PNG"); 
URL imageURL = Client.class.getClassLoader().getResource("good.PNG"); 

感謝您的幫助! !!!!!!!!

感謝Marko Topolnik,問題通過將'File.separator'替換爲'/'來解決。 非常感謝Marko Topolnik !!!!

+3

在這種情況下使用'File.separator'是錯誤的。如果你在Windows上運行它,它會失敗。 URL不使用平臺特定的分隔符,而反斜槓是錯誤的分隔符。 –

+1

Java項目的結構實際上並不令人感興趣。你需要提供的結構是你的一個jar文件('jar tvf thejarfile.jar')。看起來像是有一個缺少主要正斜槓(但不能確定) –

回答

5
  1. 不要File.separatorgetResource()使用 - 它總是需要/(認爲它作爲一個URL HREF)。
  2. 將路徑前綴爲/以確保類加載器從類路徑的根目錄搜索,而不是相對於該類的包。
  3. 檢查good.PNG是否正確。它在Windows文件系統上無關緊要,但getResource()區分大小寫。
+0

我寫了'PNG'時犯了錯誤,這也是一個問題,但主要問題是'File.separator',因爲我也真的用過'PNG'。謝謝! – Hlib