Ulfmann Geschrieben 9. März 2010 Teilen Geschrieben 9. März 2010 Hallo, ich verzweifel grad elendig an einer der klassischen Hürden bei der Erstellung von JAR Files. Ich arbeite mit Eclipse (Version 3.5.1) und versuche, eine ausführbare Jar File zu exportieren, die sich letztendlich jedoch nicht ausführen lässt (es passiert nichts). Um andere Fehlerquellen auszuschließen: Ich habe "fremde" Jar Dateien getestet, sie funktionieren. Die Umgebungsvariable sollte korrekt gesetzt sein, somit erhärtet sich mein Verdacht, dass die Manifest Datei Schuld ist. Mein Vorgehen: 1. Export Wizard aufrufen 2. Jar File auswählen, weiter 3. Bei den Specifications den Speicherort eingestellt und mein Projekt ausgewählt, weiter 4. Packaging Options, weiter 5. Jar Manifest Options "Generate the manifest file" gewählt, save [...] abgekreuzt, Seal the Jar gewählt, und die Main Class bestimmt, Finish In der durch den Wizard erstellten Manifest steht jetzt: Manifest-Version: 1.0 Sealed: true Main-Class: Gui Ein Doppelklick auf die Jar bleibt ergebnislos. Was mach ich falsch? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 9. März 2010 Teilen Geschrieben 9. März 2010 Ein Doppelklick auf die Jar bleibt ergebnislos. Was mach ich falsch? Bitte einmal das Jar via Command-Line starten und die Ausgabe bzw Fehlermeldungen posten Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ulfmann Geschrieben 9. März 2010 Autor Teilen Geschrieben 9. März 2010 Exception in thread "main" java.lang.NoClassDefFoundError: PictureQuest Caused by: java.lang.ClassNotFoundException: PictureQuest at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Could not find the main class: PictureQuest. Program will exit. Eigentlich erwartungsgemäß. Er findet also den Einstiegspunkt nicht. Ich hab ihm doch aber gesagt, wo der ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 9. März 2010 Teilen Geschrieben 9. März 2010 Servus, zeig mal bitte den Aufbau der Dateien innerhalb des JAR-Files. Und mit welchem Befehl rufst Du die Java Runtime genau auf? Denn mit java -jar <NAME>.jar sollte er nichts mit "PictureQuest" erzählen, sondern von "Gui" sprechen, denn das steht ja in der MANIFEST.MF. Schöne Grüße, Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 9. März 2010 Teilen Geschrieben 9. März 2010 Naja er findet die Klasse "PictureQuest" nicht. Aber Deine Beschreibungen sind nicht hilfreich. Prüfe die Packagenamen und die dazu gehörigen Verzeichnisse. Erstelle die Jar-Datei inkl des Manifests einmal per Console um Fehler in Deiner IDE auszuschließen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ulfmann Geschrieben 9. März 2010 Autor Teilen Geschrieben 9. März 2010 Fehler gefunden, Problem liegt woanders. Ich habe einen Bilder-Ordner in meinem Projektordner und diesen erstmal bedenkenlos mit in den src Ordner meines Projektes gelegt. Dies wurde erst ein Problem, als das Projekt exportiert wurde, da nun die Anweisung private File dir = new File ("src/BILDER"); ganz heimlich eine NullPointerException verursacht hat. Die Anwendung startet jetzt, zeigt aber Bilder an, die in einem ganz anderen Ordner liegen (der nun zufälligerweise auch "Bilder" heißt). Vielen Dank soweit für die Hilfe, nun brauch ich nur noch den sauberen Weg, den Bilderordner mit in den Buildpath mit aufzunehmen...:old Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 10. März 2010 Teilen Geschrieben 10. März 2010 Verpack die Bilder doch mit im JAR (wenn sie sich zur Laufzeit nicht ändern) und greif über Class#getResourceAsStream(...) darauf zu. Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ulfmann Geschrieben 10. März 2010 Autor Teilen Geschrieben 10. März 2010 (bearbeitet) Ich stell mich damit wirklich dusselig an und brauch nochmal Rat. Mein Bilderordner befindet sich in meinem Projektordner (das ist auch mit Eclipse angeglichen) und das Ausführen der Anwenung aus der IDE heraus klappt problemlos. private File dir = new File ("./Images"); System.out.println(dir.listFiles().length); liefert mir die korrekte Größe und Icon myIcon = new ImageIcon("./Images/Las_Vegas.jpg"); JLabel iconLabel = new JLabel(myIcon); picturePanel.add(iconLabel); stellt es mit wie gewünscht dar. Soweit so gut, aber nachdem ich daraus wieder eine Jar erstellt hab, findet er den Bilderordner nicht mehr (obwohl er mit in der Jar gelandet ist). Exception in thread "main" java.lang.NullPointerException at PictureController.<init>(PictureController.java:21) at Gui.<init>(Gui.java:43) at Start.main(Start.java:6) Die betreffende Stelle ist die Initialisierung eines String Arrays, entsprechend dimensioniert durch die Länge des eingelesenen Verzeichnisses (was offensichlich null ist). File[] files; private String[] clickedPictures; private Gui gui; public PictureController(File dir, Gui gui) { this.files = dir.listFiles(); this.gui = gui; clickedPictures = new String[files.length]; // <-- Bang! } Der Aufruf des Konstruktors erfolgt mit dem gleichen File-Objekt, das beim Test in der IDE noch problemlos gelesen werden konnte (siehe ganz oben). Kann mir nochmal jemand da raushelfen? Bearbeitet 10. März 2010 von Ulfmann Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 10. März 2010 Teilen Geschrieben 10. März 2010 Hast Du Dir die von mir genannte Methode mal angesehen? Dort lädst Du eine Ressource innerhalb des Classpaths. Was erwartest Du von der von Dir verwendeten Klasse File? Dass sie in einem JAR nach einer Datei sucht? Abhängig von was? Vom Package der aufrufenden Klasse? Vom Package der Main-Class? Vom Package der im Stack zuoberst / zuunterst liegenden Klasse? Von der Wurzel des JAR-Files aus? Von der Wurzel irgendeines JAR-Files aus? Was passiert, ist folgendes: Wenn Du mit der Klasse File arbeitest, dann wird der Pfad abhängig vom Startpunkt der Anwendung (Working Dir) aufgelöst. Das ist bei einem Start aus Eclipse raus in der Regel das Projektverzeichnis. Wenn Du Deine Anwendung dann über "java -jar ..." oder ähnlich ausführst, dann bist du evtl. in einem ganz anderen Verzeichnis. Deshalb mein obiger Tipp: leg die Bilder in den Classpath und greif mittels Class#getResourceAsStream(...) darauf zu. Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ulfmann Geschrieben 10. März 2010 Autor Teilen Geschrieben 10. März 2010 Okay, das klingt gut. So wie ich das hier seh, bekomme ich auf diese Weise Objekt vom Typ InputStream. Könntest Du mir vielleicht noch pseudocode-artig schildern, wie ich damit an meine Bilder komme? Dieser Weg ist mir völlig neu und ich google mir einen Wolf Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 10. März 2010 Teilen Geschrieben 10. März 2010 Entweder, Du liest den Stream ein und fütterst ein ImageIcon mit den bytes, oder Du verwendest die Methode Class#getResource(...), erhältst eine URL und fütterst damit das ImageIcon. Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ulfmann Geschrieben 10. März 2010 Autor Teilen Geschrieben 10. März 2010 So, ich hab es nun endlich hinbekommen, die Bilder in meiner Jar zu finden und zu verwenden. Icon icon_rel = new ImageIcon(getClass().getResource("Images/bild.jpg")); iconLabel = new JLabel(icon_rel); picturePanel.add(iconLabel); Vielen Dank nochmal für die Hilfe, aber eine kleine Sache wäre da noch. Aus der Entwicklungsumgebung lässt sich dieser Code nun nicht mehr ausführen (NullPointerException beim Aufruf der ersten Zeile oben), aus der Jar hingegen klappt es einwandfrei. Muss ich jetzt quasi bei den Tests new ImageIcon("./Images/bild.jpg"); verwenden und diesen Ausdruck vor dem Export gegen Obigen tauschen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 11. März 2010 Teilen Geschrieben 11. März 2010 Nein, Du musst nur dafür sorgen, dass der Bilderordner mit im Classpath liegt. Lies doch mal die API Dokumentation für die verwendete Methode, da stehts genau. Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ulfmann Geschrieben 11. März 2010 Autor Teilen Geschrieben 11. März 2010 Der Punkt war, dass ich Eclipse 1. noch klar machen musste, dass der Bilderordner als Source Folder verwendet werden soll und 2. dafür sorgen musste, dass er auch im src- bzw. bin Verzeichnis liegt. Kleinigkeiten, an denen man unnötig viel Zeit verlieren kann. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.