Zum Inhalt springen

Fehler in der Manifest Datei?


Empfohlene Beiträge

Geschrieben

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?

Geschrieben
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.

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben (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 von Ulfmann
Geschrieben

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

Geschrieben

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 :(

Geschrieben

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?

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...