java - read - resources in jar



Accedi alle immagini all'interno del barattolo (1)

Primo. So che esiste già una varietà di argomenti su come accedere all'immagine all'interno del file jar. Secondo. Ho provato molte opzioni e nessuno di loro non ha funzionato. Certo che so che da qualche parte faccio un errore. Puoi aiutarmi a capire cosa sto facendo male?

quindi, ho un progetto prototipo con il nome 'j' e contiene solo una classe java - Client. Cliente che tenta di accedere all'immagine good.png. Dopo aver imballato tutto in un file jar eseguibile, il client non può accedere al file. Lavoro in eclissi e uso ant.

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

com.pupcom.Client contiene

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>

Ho usato anche queste righe:

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

Grazie per qualsiasi aiuto!!!!!!!!!!

Grazie a Marko Topolnik, il problema è stato risolto sostituendo "File.separator" in "/". Mille grazie a Marko Topolnik !!!!


  1. Non utilizzare File.separator in getResource() - richiede sempre / ( getResource() come URL HREF).
  2. Prefix il percorso con / per assicurare che le ricerche del programma di caricamento classe dalla radice del percorso di classe, piuttosto che relative al pacchetto della classe.
  3. Verifica che good.PNG sia il caso corretto. Non importa sul file system di Windows, ma getResource() è sensibile al maiuscolo / minuscolo.




embedded-resource