Доступ к изображениям внутри банки


Во-первых. Я знаю, что уже существует множество тем о том, как получить доступ к изображению внутри файла jar. Второй. Я перепробовал множество вариантов и ни один из них не сработал. Конечно, я знаю, что где-то ошибаюсь. Ты можешь помочь мне понять, что я делаю не так?

Итак, у меня есть прототип проекта с именем 'j', и он содержит только один java-класс-клиент. Клиент пытается получить доступ к хорошему изображению.формат PNG. После того, как я упаковал все в исполняемый файл jar, клиент не может получить доступ к файлу. Я работаю в eclipse и используют ant.

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

Ком.пупком.Клиент содержит

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");
        }
    }
}

Построить.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, проблема была решена путем замены файла.разделитель ' to '/'. Большое спасибо Марко Топольнику!!!!

1 2

1 ответ:

  1. Не используйте File.separator в getResource() - он Всегда принимает / (думайте об этом как об URL-адресе HREF).
  2. префикс путь с /, чтобы гарантировать, что загрузчик класса ищет от корня пути класса, а не относительно пакета класса.
  3. Проверьте, что good.PNG является правильным случаем. Это не имеет значения в файловой системе Windows, но getResource() чувствителен к регистру.