Resourcen aus Jar-Archiv laden

multiholle

Aktives Mitglied
Ich habe SQL-Dateien und PNG-Dateien, die ich zur Laufzeit mit folgenden Befehlen lade:
Java:
InputStream sqlFile = getClass().getResourceAsStream("query.sql");
URL imgURL = IconFactory.class.getResource("icon.png");
Die Dateien liegen im "res"-Quellordner an gleicher Stelle wie die Klassen im "src" Quellordner. Ich bekomme beim Laden der Dateien einen Fehler, dass die Datei nicht gefunden wurde. Das Problem tritt allerdings nur auf, wenn ich mein Projekt in eine Jar-Datei packe. In Eclipse funktioniert alles Problemlos. Woran liegt das?

Ich habe in der Jar-Datei nochmal nachgesehen: Die Dateien liegen wirklich drin.
 
Schau mal in die JAR rein. Es kann sein, dass die Datein, beim Build nicht berücksichtig werden, oder in den Ordner "res" geschmissen werden.

Sollten im Ordner "res" liegen, musst du nur die Pfade anpassen; "res/query.sql" bzw. "res/icon.png".

Eventuell musst du in Eclipse (kenne mich mit der IDE nicht so gut, benutze IDEA), *.png und *.sql als Ressourcen eintragen.
(Ich nehme an, du machst den Build mit Eclipse)
 
Eventuell musst du in Eclipse (kenne mich mit der IDE nicht so gut, benutze IDEA), *.png und *.sql als Ressourcen eintragen.
Was meinst du damit?

Ich erstelle die Jar-Datei mit Ant und folgendem Script. Die Dateien liegen wirklich im src Verzeichnis.
[xml]<project name="Notenverwaltung" basedir="." default="main">
<property name="build.dir" value="release"/>

<target name="clean">
<delete dir="${build.dir}"/>
<echo message="cleaned build directory"/>
</target>

<target name="copy_sources">
<copy todir="${src.dir}/${current}">
<fileset dir="src/${current}"/>
<fileset dir="res/${current}"/>
</copy>
<copy todir="${src.dir}/common">
<fileset dir="src/common"/>
</copy>
</target>

<target name="switch_to_server">
<property name="current" value="server"/>
<property name="src.dir" value="${build.dir}/server/src"/>
<property name="classes.dir" value="${build.dir}/server/bin/classes"/>
<property name="jar.dir" value="${build.dir}/server/bin"/>
<property name="main-class" value="server.Server"/>
<echo message="building server"/>
<antcall target="build"/>
</target>

<target name="switch_to_client">
<property name="current" value="client"/>
<property name="src.dir" value="${build.dir}/client/src"/>
<property name="classes.dir" value="${build.dir}/client/bin/classes"/>
<property name="jar.dir" value="${build.dir}/client/bin"/>
<property name="main-class" value="client.Client"/>
<echo message="building client"/>
<antcall target="build"/>
</target>

<target name="compile" depends="copy_sources">
<!-- server -->
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}">
<classpath>
<pathelement location="lib/table_layout.jar"/>
</classpath>
</javac>
</target>

<target name="jar" depends="compile">
<!-- server -->
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${current}.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
</manifest>

<zipfileset excludes="META-INF/*.SF" src="lib/mysql_connector.jar"/>
<zipfileset excludes="META-INF/*.SF" src="lib/table_layout.jar"/>
</jar>
<delete dir="${classes.dir}"/>
</target>

<target name="copy_files">
<copy file="res/${current}/${current}.properties" todir="${build.dir}/${current}"/>
<copy file="res/${current}/${current}.sh" todir="${build.dir}/${current}"/>
<copy file="res/${current}/${current}.bat" todir="${build.dir}/${current}"/>
<copy file="res/${current}/keystore" todir="${jar.dir}"/>
<copy file="res/${current}/truststore" todir="${jar.dir}"/>
<copy file="res/${current}/${current}.sh" todir="${build.dir}/${current}"/>
</target>

<target name="build" depends="jar, copy_files"/>

<target name="main">
<antcall target="clean"/>
<antcall target="switch_to_server"/>
<antcall target="switch_to_client"/>
</target>
</project>
[/xml]
 
Du solltest deine Ressourcen gleich in das ${jar.dir} kopieren. Java kompilliert (so weit ich weis) wirklich nur die .java Dateien und legt die entstanden Klassen in ${classes.dir}

Versuch es mal mit:
[xml]
<target name="copy_sources">
<copy todir="${src.dir}/${current}">
<fileset dir="src/${current}"/>
</copy>
<copy todir="${classes.dir}/${current}">
<fileset dir="res/${current}"/>
</copy>
<copy todir="${src.dir}/common">
<fileset dir="src/common"/>
</copy>
</target>
[/xml]

Natürlich solltest du ${classes.dir} dann nicht erst im Target "compile" deklarieren.

Edit: jar.dir in classes.dir geändert.
 
Zuletzt bearbeitet:
Ist Richtig. javac kompiliert nur .java Dateien und lässt den Rest aus. Einfach per copy die benötigten Ressourcen mit in das Verzeichnis, aus dem das JAR generiert wird kopieren. Aus diesem Sinne macht es dann z.B. auch Sinn ein eigenes Verzeichnis für Ressourcen zu nutzen.
 

Zurück
Oben