Hallo,
ich habe ein Problem, mit Eclipse ein Runnalbe JAR File zu erstellen, in das auch Bilddateien hineinkommen sollen. Bevor ich mich heute in diesem Forum registriert habe, habe ich natürlich gegoogelt und viele Posts zu diesem Thema entdeckt. Aber mit keinem einzigen bin ich der Lösung einen Schritt näher gekommen. Also versuch ich es mal auf diesem Wege. Ich habe folgendes Programm
Die Bilddatei bild.jpg liegt im Ordner, wo auch die class-Dateien sind, also in bin/forum/beispiel. Wenn ich mein Programm mit dem run-Button starte, macht es genau das, was es soll. Wenn ich aber über File|Export|Runnable JAR File gehe, dann wird eine JAR-Datei erstellt, die die Datei bild.jpg nicht enthält. Muss ich vielleicht unter Eclipse noch irgendwo einen Pfad einstellen, damit Eclipse weiß, wo noch Bilddateien sind, die dem Archiv hinzugefügt werden sollen?
Leg die Datei einfach in den Ordner src. Dann sollte die automatisch ins bin Verzeichnis und in deine jar Datei kopiert werden. Oft leg man solche Dateien aber auch in nen eigenen source folder der dann resource heißt.
Habe ich schon gemacht. Ich habe die Bilddatei in jeden möglichen Ordner innerhalb der Projekt-Struktur gepackt. Aber im JAR-File ist sie nicht enthalten.
Ich habe übrigens auf Kommandozeileneben mithilfe des jar-Kommandos und einer Manifest-Datei genau dieses Package in ein JAR packen können. Da war das Bild drin und die JAR-Datei ließ sich mit einem Doppelklick ohne Probleme ausführen. Da ich aber nicht immer über die Kommandozeile gehen möchte, bin ganz stark daran interessiert, dass es auch unter Eclipse machbar ist.
kann man beim Exportieren nicht mit angeben/selektieren was exportiert werden soll? bzw. wenn man auf unterster Packageebene oder auf Projektebene exportiert sollten alle Inhalte des Packages enthalten sein.
Das Bild darf nicht gepackt werden, das kann sonst nimmer gelesen werden.
Lege dir einen Order "res" oder "resource" an und verweise darauf. Nach dem Build fügst du diesen Resourcen-Ordner einfach neben dem JAR ein.
Das ist gängig und wird oft so gemacht. In dem Ordner lassen sich auch wunderbar Log files sammeln, Properties ablegen, NLS-Dateien, XML-Konfigurationen, ....
Wie kommst Du zu der Meinung?
Es ist gängige Praxis Resourcen wie Bilder und Konfigdaten usw., die nur gelesen werden müssen mit in das jar zu packen. Bestes Beispiel sind die Demos die mit dem JDK mitgeliefert werden. Diese besitzen ein resources Package innerhalb des jars.
Wenn man Resourcen neben dem jar ablegt, werden diese nur gefunden wenn das jar aus diesem Verzeichnis heraus gestartet wird - z.b. durch Doppelclick, entsprechendes Startskript...
@Airborne: Natürlich funktioniert das mit Bildern in einem JAR. Ich kann doch ein solches JAR mithilfe des jar-commands auf der Kommandozeilenebene erstellen. Aber in Eclipse kriege ich das nicht hin. Ich habe meine jpg-Datei schon in alle möglichen Ordner gepackt. Aber nie ist sie am Schluss im JAR. Deswegen ist meine Hoffnung, dass ich vielleicht irgendwo ein Häkchen vergessen habe oder dass irgendwo der Pfad, der zu den Bildern führt, hinterlegt sein muss, was eigentlich wenig Sinn macht, weil der Ordner, in dem sich die class-Dateien befinden, auch der natürliche Ordner für jpg-Dateien sein müsste.
Mit dem Kopf durch die Wand gell? Naja, wenn es denn bei einem Bild bleibt...
Viele Systeme haben Probleme solche Dateien direkt im JAR zu finden, zudem startet man auch nicht immer das Programm vor Ort (zumindest wenn man den Studenten-Status mal hinter sich gelassen hat...).
Rechts Klick auf Projekt -> Properties -> Build Path -> Registerkarte "Order and Export"
was dann aber an der Dummheit der Entwickler liegt... eine Resource im Classpath zu haben und dann zu laden ist wohl alles andere als schwer.
einfach den resourcen ordner beim export angeben (siehe anhang)
und das "Order Export" ist nur fuer den internen Classpath von Eclipse und hat nix mit dem Export in ein jar zu tun - aber ja es sollte da sein bzw der Ordner in dem es liegt...
@bygones: Ich habe zwar den Ordner "src" unterhalb des Projektsnamens, aber nicht den Ordner "res". Wie kriege ich das hin, dass ich ebenfalls einen res-Ordner habe?
@Michael: Den Export nach einem Jar-File habe ich auch mal ausprobiert. Leider ohne Erfolg. Man kommt ja da zu einem Fenster "Select the resource to export". Unter dem Projektnamen finden sich die Einträge "src" und ".settings". Wenn ich jetzt unter "src/forum.beispiel" nachschaue, steht da nur die Java-Datei. Eine jpg-Datei, auch wenn ich sie in den Ordner vorher kopiert habe, wird dort nicht aufgelistet. Im rechten Teil des Fensters stehen noch ".classpath" und ".project". Bei mir ist von den 4 Optionen nur die erste Option "Export generated class files and resources" aktiviert. Könnte es daran liegen?
@bygones: Ich habe zwar den Ordner "src" unterhalb des Projektsnamens, aber nicht den Ordner "res". Wie kriege ich das hin, dass ich ebenfalls einen res-Ordner habe?
@Michael: Den Export nach einem Jar-File habe ich auch mal ausprobiert. Leider ohne Erfolg. Man kommt ja da zu einem Fenster "Select the resource to export". Unter dem Projektnamen finden sich die Einträge "src" und ".settings". Wenn ich jetzt unter "src/forum.beispiel" nachschaue, steht da nur die Java-Datei. Eine jpg-Datei, auch wenn ich sie in den Ordner vorher kopiert habe, wird dort nicht aufgelistet.
Ob Class Folder oder Source Folder ist doch egal oder? Schlussendlich landet das resource file in der jar.
Wenn man nen Maven Projekt anlegt wird der resource Ordner auch als source folder angelegt, soo falsch kanns also nicht sein.
@bygones: Ich habe einen neuen Ordner - habe ihn "res" genannt - angelegt, so wie Du es beschrieben hast. Dann habe ich noch "Add class folder" durchgeführt. Jetzt sehe ich diesen Ordner im Package Explorer unter dem Projektnamen.
Ich habe dann auf Explorer-Ebene meine Bilddatei in den neuen Ordner "res" hineinkopiert. Und dann habe ich ein Jar File erstellt. Aber obwohl ich unter "Select the resources ... " jetzt den neu erstellten res-Ordner auswählen konnte, enthält das JAR meine Bilddatei nicht. Kann es sein, dass ich unter Eclipse die Bild.jpg in diesen Ordner packen muss und dass ein Kopieren auf Explorer-Ebene, wie ich es gemacht habe, nicht ausreicht?
Ich habe dann auf Explorer-Ebene meine Bilddatei in den neuen Ordner "res" hineinkopiert. Und dann habe ich ein Jar File erstellt. Aber obwohl ich unter "Select the resources ... " jetzt den neu erstellten res-Ordner auswählen konnte, enthält das JAR meine Bilddatei nicht. Kann es sein, dass ich unter Eclipse die Bild.jpg in diesen Ordner packen muss und dass ein Kopieren auf Explorer-Ebene, wie ich es gemacht habe, nicht ausreicht?
mach mal ein refresh auf den Ordner, dann sollte das Bild da sein.
Ansonsten immer am besten das kopieren direkt in eclipse machen. Also zb im Explorer Datei auswaehlen -> CTRL + C -> in Eclipse den gewuenschten Ordner auswaehlen und CTRL + V -> dann sieht man diesen auch Eclipse. Ansonsten erkennt Eclipse die Aenderung nicht
Wunderbar! Das mit dem refresh hat geklappt. Ich habe mit WinZip in das JAR reingeschaut, und das Bild ist drin!! Da habe ich noch eine Frage: Im JAR-File steht die class-Dateien mit dem Pfad "forum\Beispiel" und die Manifest.mf-Datei mit dem Pfad "meta-inf\". Aber bei der Datei bild.jpg steht unter Pfad nichts. Da müsste doch eigentlich eine Angabe wie "forum\Beispiel\res" stehen. Wie könnte ich das erreichen?
Aber bei der Datei bild.jpg steht unter Pfad nichts. Da müsste doch eigentlich eine Angabe wie "forum\Beispiel\res" stehen. Wie könnte ich das erreichen?
Grundsätzlich liegt es am Programmier. In Deinem Fall hast Du es ja scheinbar so definiert, dass das Bild und die Klasse im selben Package forum.beispiel sind.
Ich habe im gleichen Package einen Source Folder eingerichtet. Unter "Folder Name" habe ich "bin" eingetragen. Dann habe ich die Bilddatei bild.jpg, wie von bygones vorhin beschrieben, nach bin\forum.beispiel kopiert. Wenn ich jetzt ein Runnable JAR file erstelle, ist das Bild im Archiv und hat außerdem den gleichen Pfad wie die class-Dateien. Das Schönste ist, ich kann es mit Doppelklick starten. Ich danke allen für die Hilfe, ohne die ich es nicht geschafft hätte. Besonderen Dank an Michael und bygones.