java - 访问jar内的图像

标签 java jar embedded-resource

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

所以,我有一个名为“j”的原型(prototype)项目,它只包含一个 java 类 - Client。 客户端尝试访问图片 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>

我还使用了这些行:

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”替换为“/”解决了该问题。 非常感谢马尔科·托波尔尼克!!!!

最佳答案

  1. 不要在 getResource() 中使用 File.separator - 它总是需要 / (认为将其作为 URL HREF)。
  2. 在路径前添加 / 前缀,以确保类加载器从类路径的根目录开始搜索,而不是相对于类的包进行搜索。
  3. 检查 good.PNG 的大小写是否正确。这在 Windows 文件系统上并不重要,但 getResource() 区分大小写。

关于java - 访问jar内的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10469533/

相关文章:

c# - 如何为dll文件设置自定义图标?

java - Android在Eclipse中添加操作栏时出现问题

java - 如何使用 Spring Data Mongo DB 对类进行建模来存储具有不同长度字段和类型的嵌套 JSON 文档

java - 在 jar 中运行时从资源文件夹中获取文件名列表

java - maven 的 Crystal 报告 jar

Java "could not find or load main class"类路径错误

delphi - 是否可以在 Delphi 可执行应用程序中嵌入并运行 exe 文件?

java - 每个线程使用唯一 ID 并释放它以供重用

java - PrintWriter vs PrintStream vs OutputStreamWriter 时间成本

java - 为什么我的 JAR 文件没有与其文件夹一起打包并读取它们?