Java 访问jar中的图像

Java 访问jar中的图像,java,jar,embedded-resource,Java,Jar,Embedded Resource,首先。我知道,关于如何访问jar文件中的图像,已经存在各种各样的主题。 第二我尝试了很多选择,但没有一个不起作用。我当然知道我在某个地方犯了错误。你能帮我理解我做错了什么吗 所以,我有一个名为“j”的原型项目,它只包含一个java类-客户机。 试图访问image good.png的客户端。在我将所有内容打包到可执行jar文件后,客户端无法访问该文件。 我在eclipse中工作,并使用ant j/ -src/ --com/ ---pupcom/ ----Client.java -images/ -

首先。我知道,关于如何访问jar文件中的图像,已经存在各种各样的主题。 第二我尝试了很多选择,但没有一个不起作用。我当然知道我在某个地方犯了错误。你能帮我理解我做错了什么吗

所以,我有一个名为“j”的原型项目,它只包含一个java类-客户机。 试图访问image good.png的客户端。在我将所有内容打包到可执行jar文件后,客户端无法访问该文件。 我在eclipse中工作,并使用ant

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>
谢谢你的帮助

多亏了Marko Topolnik,通过将“File.separator”替换为“/”解决了这个问题。 非常感谢Marko Topolnik

  • 不要在
    getResource()
    中使用
    文件.separator
    -它总是接受
    /
    (将其视为URL HREF)
  • 在路径前面加上
    /
    ,以确保类加载器从类路径的根进行搜索,而不是相对于类的包进行搜索
  • 检查
    good.PNG
    的大小写是否正确。这在Windows文件系统上并不重要,但
    getResource()
    区分大小写

  • 在此上下文中使用
    File.separator
    是错误的。如果在Windows上运行此操作,它将失败。URL不使用特定于平台的分隔符,反斜杠是错误的分隔符。Java项目的结构实际上并不有趣。您需要提供的结构是一个jar文件(
    jar-tvf thejarfile.jar
    )。看起来缺少一个前导正斜杠(但不能确定)我在写“PNG”时犯了错误,这也是一个问题,但主要问题是“File.separator”,因为我也确实使用了“PNG”。谢谢
    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");