Jar-Datei mit Doppelklick nicht ausführbar?: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K (Spezialfall Windows)
K (Spezialfall Windows)
 
(34 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Jar-Dateien ('''J'''ava '''Ar'''chive) sind prinzipiell im Zip-Format komprimierte Dateien, die aber durch spezielle Inhalte erweitert wurden. Per Doppelklick können von der [[JVM]] die in ihnen verpackten Java-Anwendungen ausgeführt werden.
+
'''Autor: Gernot Segieth'''
 +
 
 +
Jar-Dateien ('''J'''ava '''Ar'''chive) sind prinzipiell im Zip-Format komprimierte Dateien, die aber durch spezielle Inhalte erweitert wurden.
 +
 
 +
'''Per Doppelklick können von der [[JVM]] die in ihnen verpackten Java-Anwendungen ausgeführt werden.'''
  
 
Du hast eine [[JAR-Datei]] erzeugt oder erhalten und diese lässt sich nicht per Doppelklick starten? Lösungen zu diesem Problem werden wir im Folgenden besprechen.
 
Du hast eine [[JAR-Datei]] erzeugt oder erhalten und diese lässt sich nicht per Doppelklick starten? Lösungen zu diesem Problem werden wir im Folgenden besprechen.
 +
 +
Klarstellung: Eine Jar-Datei öffnen und eine Jar-Datei starten, sind zwei grundverschiedene Operationen!
  
 
=Anwendung oder Bibliothek?=
 
=Anwendung oder Bibliothek?=
Jar-Dateien fassen in sich geschlossene Anwendungen oder Bibliotheken (Library) zusammen. Während Bibliotheken nicht ausführbar sind und dazu dienen Funktionalität für ein Programm bereit zu stellen, sind Anwendungen, die in Jar-Dateien gespeichert sind durchaus per Doppelklick ausführbar.  
+
Jar-Dateien fassen in sich geschlossene Anwendungen oder Bibliotheken (Library) zusammen. Während Bibliotheken nicht ausführbar sind und dazu dienen, Funktionalität für ein Programm bereit zu stellen, sind Anwendungen, die in Jar-Dateien gespeichert sind durchaus per Doppelklick ausführbar.  
 +
 
 +
Ist die Jar-Datei nicht per Doppelklick ausführbar, liegt möglicherweise eine Bibliothek vor. Um das zu prüfen, sieht man sich kurzerhand den Inhalt der Jar-Datei mit einem Packprogramm an. Mehr dazu gleich anschließend.
 +
 
 +
'''Grundsätzlich müssen wir uns zu aller erst folgende Frage stellen:'''
 +
'''Kann nur diese bestimmte Jar-Datei, nicht gestartet werden, oder sind alle Jar-Dateien betroffen?'''
  
Ist die Jar-Datei nicht per Doppelklick ausführbar, liegt möglicherweise eine Bibliothek vor. Um das zu prüfen, sieht man sich kurzerhand den Inhalt der Jar-Datei mit einem Packprogramm an.
+
=Problem mit einer bestimmten Jar-Datei=
 +
Es ist nur eine Jar-Datei, die nicht startet? Andere Jar-Dateien starten?
  
=Aufbau und Inhalt von META-INF=
+
Dann kann man zunächst die Jar-Datei untersuchen. Handelt es sich also überhaupt um eine ausführbare Jar-Datei?
Damit eine Jar-Datei ausführbar wird, enthält sie, wie bereits oben beschrieben, weitere spezielle Inhalte, die von der JVM ausgelesen und verarbeitet werden können. Im Wesentlichen handelt es sich dabei um das Verzeichnis ''META-INF'' bzw. um seinen Inhalt. In diesem Verzeichnis muss die [https://wiki.byte-welt.net/wiki/JAR-Datei#MANIFEST.MF Manifest-Datei] enthalten sein. Das Verzeichnis META-INF selbst liegt im Wurzelverzeichnis der Jar-Datei.
 
  
<code=ini>
+
==Jar-Datei in der Eingabeaufforderung/Terminal starten==
[/]
+
Um zu testen, ob eine Jar-Datei zumindest fehlerfrei auf der Kommandozeile starten kann, wird folgender Befehl eingegeben:
  |__[META-INF]
+
java -jar MeinJar.jar
|    |__ MANIFEST.MF
+
''MeinJar.jar'' bezeichnet dabei die auszuführende Jar-Datei. Zum Aufruf muss man sich bereits in dem Verzeichnis befinden, in welchem die Jar-Datei gespeichert wurde.
|
+
 
|__[mypackage]
+
Sollte es ein Problem mit der Jar-Datei geben, das die Ausführung verhindert, wird eine Fehlermeldung auf der Console/Eingabeaufforderung/Terminal ausgegeben.
      |__ Main.class
+
'''Der erste Schritt bei Problemen mit Jar-Dateien ist also immer, zu prüfen, ob bei der Ausführung Fehler auf der Console ausgegeben werden.'''
</code=ini>
+
 
 +
Sollte ein Fehler auf der Kommandozeile ausgegeben werden, führt dieser oft dazu, dass die Jar-Datei nicht starten kann. Fehlende Klassen bzw. fehlende Jar-Dateien, fehlende Resourcen, falsch angegebene Verzeichnisse, JRE-Versionsunterschiede usw.
 +
 
 +
Mehr zu Fehlermeldungen weiter unten.
 +
 
 +
==Aufbau und Inhalt von META-INF==
 +
'''Damit eine Jar-Datei ausführbar wird, enthält sie, wie bereits oben beschrieben, weitere spezielle Inhalte''', die von der JVM ausgelesen und verarbeitet werden können. Im Wesentlichen handelt es sich dabei um das Verzeichnis ''META-INF'' bzw. um seinen Inhalt. In diesem Verzeichnis muss die [https://wiki.byte-welt.net/wiki/JAR-Datei#MANIFEST.MF Manifest-Datei] enthalten sein. Das Verzeichnis META-INF selbst liegt im Wurzelverzeichnis der Jar-Datei.
 +
 
 +
  [/]
 +
  |__[META-INF]
 +
  |    |__ MANIFEST.MF
 +
  |
 +
  |__[mypackage]
 +
      |__ Main.class
  
 
Die Manifest-Datei enthält eine Reihe von Informationen, die der Interpreter für die Ausführung einer Java-Anwendung benötigt.
 
Die Manifest-Datei enthält eine Reihe von Informationen, die der Interpreter für die Ausführung einer Java-Anwendung benötigt.
  
 
In der Manifest-Datei müssen, damit eine Java-Anwendung per Jar-Datei ausführbar wird, mindestens folgende Angaben enthalten sein:
 
In der Manifest-Datei müssen, damit eine Java-Anwendung per Jar-Datei ausführbar wird, mindestens folgende Angaben enthalten sein:
<code=ini>
+
 
Manifest-Version: 1.0
+
Manifest-Version: 1.0
Main-Class: mypackage.Main
+
Main-Class: mypackage.Main
<Leerzeile>
+
<Leerzeile>
</code=ini>
+
 
Hinter Main-Class verbirgt sich die [[Klasse]], die die main()-[[Methode]] enthält und damit die Anwendung starten kann. Die Klasse heißt ''Main.class'' und liegt in diesem (obigen) Beispiel im [[Package]] ''mypackage''.
+
Hinter Main-Class verbirgt sich die [[Klasse]], die die main()-[[Methode]] enthält und damit die Anwendung starten kann. Die Klasse heißt in diesem (obigen) Beispiel ''Main.class'' und liegt im [[Package]] ''mypackage''.
 
  '''Wichtig:''' Ohne eine Leerzeile am Ende der Manifest-Datei wird die Jar-Datei nicht per Mausklick ausführbar sein!
 
  '''Wichtig:''' Ohne eine Leerzeile am Ende der Manifest-Datei wird die Jar-Datei nicht per Mausklick ausführbar sein!
 
Dieser Fehler tritt oft nur auf, wenn man die Jar-Datei manuell in der Eingabeaufforderung/Terminal erzeugt hat und die Leerzeile vergessen wurde. Eigentlich alle großen Java-[[IDE|IDEs]] können ausführbare Jar-Dateien erzeugen und werden diesen Part richtig machen.
 
Dieser Fehler tritt oft nur auf, wenn man die Jar-Datei manuell in der Eingabeaufforderung/Terminal erzeugt hat und die Leerzeile vergessen wurde. Eigentlich alle großen Java-[[IDE|IDEs]] können ausführbare Jar-Dateien erzeugen und werden diesen Part richtig machen.
  
=Jar-Datei in der Eingabeaufforderung/Terminal starten=
+
Wenn wir externe Bibliotheken, wie bspw. einen Datenbanktreiber oder ein [[LookAndFeel]] in unserem Programm benutzen, müssen diese entsprechend im Manifest unserer Jar-Datei eingebunden sein.
Um zu testen, ob eine Jar-Datei zumindest fehlerfrei auf der Kommandozeile starten kann, wird folgender Befehl eingegeben:
+
 
<code=ini>
+
Class-Path: ./db/database.jar ./laf/look-and-feel.jar
java -jar MeinJar.jar
+
 
</code=ini>
+
Daher müsste die Zeile '''Class-Path:''' in der Manifest-Datei enthalten sein. In unserem Beispiel sind die eingebundenen Bibliotheken in verschiedenen Verzeichnissen relativ zu unserer Jar-Datei abgelegt.<br>
''MeinJar.jar'' bezeichnet dabei die auszuführende Jar-Datei. Zum Aufruf muss man sich bereits in dem Verzeichnis befinden, in welchem die Jar-Datei gespeichert wurde.
+
Der Datenbanktreiber liegt, ausgehend vom Verzeichnis unserer Jar-Datei, eine Verzeichnisebene tiefer, im Verzeichnis ''db''. Die Bibliothek des eingesetzten LookAndFeel liegt, ausgehend vom Verzeichnis unserer Jar-Datei, eine Verzeichnisebene tiefer, im Verzeichnis ''laf''.
 +
 
 +
Wenn die Bibliotheken für den Java-[[Interpreter]] nicht in den in unserer Manifest-Datei bezeichneten Verzeichnissen zu finden sind, wird ein Fehler auf der Console ausgegeben werden und unsere Jar-Datei ist möglicherweise nicht ausführbar.
 +
 
 +
=Generelles Problem mit Jar-Dateien=
 +
Es gibt in allen Betriebssystemen Konstellationen, die verhindern, dass eine Jar-Datei nach einem (Doppel-)Klick mit der Maus auf das Dateisymbol startet.
  
Sollte es ein Problem mit der Jar-Datei geben, das die Ausführung verhindert, wird eine Fehlermeldung auf der Console/Eingabeaufforderung/Terminal ausgegeben.
+
  '''Voraussetzung zum Starten von Jar-Dateien ist eine passende [[JRE]]!'''
  '''Der erste Schritt bei Problemen mit Jar-Dateien sollte also immer sein, zu sehen, ob bei der Ausführung Fehler auf der Console ausgegeben werden.'''
 
  
=Verknüpfung mit dem Java-Interpreter=
+
*Ist eine aktuelle JRE installiert? Ältere JREs starten Code von neueren Compilern nicht. Mehr dazu im Kapitel '''Fehlermeldungen auf der Java-Console''' im Abschnitt [[Jar-Datei_mit_Doppelklick_nicht_ausf%C3%BChrbar%3F#UnsupportedClassVersionError|UnsupportedClassVersionError]]
Bei Einsatz bestimmter Komprimierungs- bzw. Archivierungsprogramme, wie bspw. WinRar oder 7Zip, kommt es gelegentlich aufgrund falscher Programmeinstellungen vor, dass diese Programme statt der gewünschten Jar-Datei beim Doppelklick auf eine Jar-Datei gestartet werden. Statt die Jar-Datei der JVM zu überlassen, leitet das Betriebssystem den Aufruf an das Packprogramm weiter, welches nun den Inhalt der Jar-Datei anzeigt.<br>
+
*Bei vielen Linux-Distributionen ist bspw. die Jar-Datei mit einem Archivierungsprogramm verknüpft, so dass der Inhalt der Jar-Datei angezeigt wird, statt dass sie gestartet wird.
 +
==Verknüpfung mit dem Java-Interpreter==
 +
Bei Einsatz bestimmter Komprimierungs- bzw. Archivierungsprogramme, wie bspw. [http://www.winrar.de/ WinRar] oder [http://www.7-zip.org/ 7Zip], kommt es gelegentlich aufgrund falscher Programmeinstellungen vor, dass diese Programme statt der gewünschten Jar-Datei beim Doppelklick auf eine Jar-Datei gestartet werden. Statt die Jar-Datei der JVM zu überlassen, leitet das [[Betriebssystem]] den Aufruf an das Packprogramm weiter, welches nun den Inhalt der Jar-Datei anzeigt.<br>
 
In den Einstellungen der Programme sollte nun zur Fehlerbehebung der Haken zum Öffnen von Jar-Dateien entfernt werden.
 
In den Einstellungen der Programme sollte nun zur Fehlerbehebung der Haken zum Öffnen von Jar-Dateien entfernt werden.
  
==Interpreter-Typen==
+
Wenn man die Systemeinstellungen seines Linux-Systems nicht ändern möchte, kann man einen [[Programmstarter für Java-Programme anlegen]]. Der Doppelklick auf das angelegte Symbol startet dann das Java-Programm.
Es gibt zwei verschiedene Java-Interpreter. Zumindest unter Windows. Unter [[Linux]] gibt es nur einen [[JRE|Interpreter]], dem einerseits in der [[Kommandozeile]] auszuführende Java-Programme übergeben werden können. Andererseits kann man in Linux auch Einstellungen im System festmachen, die dann eine [[JAR-Datei|Jar-Datei]] mit Doppelklick, ohne Console starten können.
+
 
 +
===Interpreter-Typen===
 +
Es gibt zwei verschiedene Java-Interpreter. Zumindest unter [[Windows]]. Unter [[Linux]] gibt es nur einen [[JRE|Interpreter]], dem einerseits in der [[Kommandozeile]] auszuführende Java-Programme übergeben werden können. Andererseits kann man in Linux auch Einstellungen im System festmachen, die dann eine [[JAR-Datei|Jar-Datei]] mit Doppelklick, ohne Console starten können.
  
 
Unter Windows wurden den Interpretern 2 Einsatzzwecke zugedacht. Will man ein Java-Programm auf der Kommandozeile starten, wird <code>java.exe</code> eingesetzt. Dieser Interpreter erzeugt Ausgaben auf der Java-Console bzw. auf der Kommandozeile, so dass bspw. [[Exception (Java)|Java-Fehlermeldungen]] oder Textausgaben, die im Programm mit <code>System.out.println()</code> erzeugt wurden, auf der Kommandozeile landen.
 
Unter Windows wurden den Interpretern 2 Einsatzzwecke zugedacht. Will man ein Java-Programm auf der Kommandozeile starten, wird <code>java.exe</code> eingesetzt. Dieser Interpreter erzeugt Ausgaben auf der Java-Console bzw. auf der Kommandozeile, so dass bspw. [[Exception (Java)|Java-Fehlermeldungen]] oder Textausgaben, die im Programm mit <code>System.out.println()</code> erzeugt wurden, auf der Kommandozeile landen.
Zeile 55: Zeile 87:
 
Für Programmstarts per Doppelklick sollte also die Verknüpfung in der Windows-Registry auf <code>javaw.exe</code> gesetzt sein. Im folgenden Kapitel gehen wir näher darauf ein.
 
Für Programmstarts per Doppelklick sollte also die Verknüpfung in der Windows-Registry auf <code>javaw.exe</code> gesetzt sein. Im folgenden Kapitel gehen wir näher darauf ein.
  
==Spezialfall Windows==  
+
===Spezialfall Windows===
 
[[Datei:ExtMan_Dateiendungen.PNG|mini|Schritt 3 - Dateiendung suchen]]
 
[[Datei:ExtMan_Dateiendungen.PNG|mini|Schritt 3 - Dateiendung suchen]]
 
[[Datei:ExtMan_Erweiterung_bearbeiten.PNG|mini|Schritt 5 - Erweiterung bearbeiten]]
 
[[Datei:ExtMan_Erweiterung_bearbeiten.PNG|mini|Schritt 5 - Erweiterung bearbeiten]]
Zeile 63: Zeile 95:
 
Das manuelle Beheben des Fehlers durch Eingriff in die Registry gestaltet sich inzwischen mit unter als nicht so trivial, weil mit jeder neuen Windows-Version sich die Struktur der Registry geändert hat.  
 
Das manuelle Beheben des Fehlers durch Eingriff in die Registry gestaltet sich inzwischen mit unter als nicht so trivial, weil mit jeder neuen Windows-Version sich die Struktur der Registry geändert hat.  
  
Mit Hilfe des kleinen Tools '''ExtMan''' lässt sich das Problem jedoch auf jedem Windows-System prüfen und ggf. reparieren.
+
Mit Hilfe von kleinen Tools wie [https://www.heise.de/download/product/jarfix-41657 JarFix] oder '''ExtMan''' lässt sich das Problem jedoch auf jedem Windows-System prüfen und ggf. reparieren.
  
 
*'''Schritt 1:''' Herunterladen des Programms [https://www.google.de/search?q=extman ExtMan]
 
*'''Schritt 1:''' Herunterladen des Programms [https://www.google.de/search?q=extman ExtMan]
Zeile 73: Zeile 105:
 
*'''Schritt 4:''' Auf der rechten Seite den Button ''Erweiterung bearbeiten'' klicken
 
*'''Schritt 4:''' Auf der rechten Seite den Button ''Erweiterung bearbeiten'' klicken
  
*'''Schritt 5:''' Im Bearbeitungsdialog sollte nun bereits die Aktion ''open'' eingetragen sein. Dieser ist nun zu markieren/selektieren. Sollte die Aktion nicht existieren, muss sie angelegt werden. Dazu klicken wir auf ''Neue Aktion'', geben  
+
*'''Schritt 5:''' Im Bearbeitungsdialog sollte nun bereits die Aktion ''open'' eingetragen sein. Dieser ist nun zu markieren/selektieren. Sollte die Aktion nicht existieren, muss sie angelegt werden. Dazu klicken wir auf ''Neue Aktion'', geben ''open'' ein und bestätigen. Anschließend sollte der Bearbeitungsdialog so aussehen, wie im Bild zu Schritt 5.
''open'' ein und bestätigen. Anschließend sollte der Bearbeitungsdialog so aussehen, wie im obigen Bild.
 
  
 
*'''Schritt 6:''' Dieser Eintrag wird nun bearbeitet. Dazu klicken wir auf den Button ''Bearbeiten''.
 
*'''Schritt 6:''' Dieser Eintrag wird nun bearbeitet. Dazu klicken wir auf den Button ''Bearbeiten''.
Zeile 89: Zeile 120:
  
 
=="Failed to load main class"==
 
=="Failed to load main class"==
Wenn der Interpreter aus irgendeinem Grund die Start-Klasse (Klasse mit der main()-Methode) nicht laden kann, gibt er diese Fehlermeldung aus: "Failed to load main class"
+
Wenn der Interpreter aus irgendeinem Grund die Start-Klasse ([[Klasse]] mit der main()-[[Methode]]) nicht laden kann, gibt er diese Fehlermeldung aus: "Failed to load main class"
 
Die Ursachen dafür können recht vielfältig sein. Z.B. ein Fehler in der Manifest-Datei. (Siehe [https://wiki.byte-welt.net/wiki/Jar-Datei_mit_Doppelklick_nicht_ausf%C3%BChrbar%3F#Aufbau_und_Inhalt_von_META-INF Aufbau und Inhalt von META-INF])
 
Die Ursachen dafür können recht vielfältig sein. Z.B. ein Fehler in der Manifest-Datei. (Siehe [https://wiki.byte-welt.net/wiki/Jar-Datei_mit_Doppelklick_nicht_ausf%C3%BChrbar%3F#Aufbau_und_Inhalt_von_META-INF Aufbau und Inhalt von META-INF])
  
 
==NoClassDefFoundError==
 
==NoClassDefFoundError==
 
Wenn eine Klasse beim Kompilieren noch gefunden wurde, aber zur Laufzeit nicht mehr, kommt es zu einem {{JAPI|NoClassDefFoundError}}.
 
Wenn eine Klasse beim Kompilieren noch gefunden wurde, aber zur Laufzeit nicht mehr, kommt es zu einem {{JAPI|NoClassDefFoundError}}.
 +
 +
In den meisten Fällen wurden beim Erzeugen der Jar-Datei nicht '''alle''' .class-Dateien in die Jar-Datei gepackt. Oder es gibt abhängige Bibliotheken, die im Programm benutzt wurden und nicht in der Manifest-Datei im ''classpath'' eingetragen sind, bzw. nicht am Ende des erwarteten Pfades erreichbar sind.
 +
 +
==UnsupportedClassVersionError==
 +
Der Byte-Code der Class-Dateien (Ergebnis des Kompilierens von Quellcode) ist nicht abwärtskompatibel. Das bedeutet, dass ein Java-Programm, das mit einem aktuellen Compiler kompiliert wurde, nicht auf in einer älteren [[JVM]] laufen wird.
 +
 +
Beispiele:
 +
# <span style="Color:red">Compiler-Version Java 8 -> JVM-Version Java 7</span>
 +
# <span style="Color:green">Compiler-Version Java 7 -> JVM-Version Java 8</span>
 +
 +
Im Beispiel 1 wird ein {{JAPI|UnsupportedClassVersionError}} geworfen. Das bedeutet, dass auf dem Rechner, der das Java-Programm (Jar-Datei) ausführen soll, eine aktuellere [[JRE]] installiert werden muss.
 +
 +
Welche Java-Version auf dem Computer installiert ist, erfährt man mit folgendem Befehl auf der Kommandozeile:
 +
<code>java -version</code><br>
 +
Manchmal erhält man eine Fehlermeldung, obwohl Java installiert wurde. Das passiert, wenn die Umgebungsvariablen <code>JAVA_HOME</code> und/oder <code>PATH</code> den Pfad zum Java-Interpreter '''nicht''' enthalten.
 +
 +
Wie man ermitteln kann, mit welcher Compiler-Version das vorliegende Programm vom Entwickler kompiliert wurde, ist in unserem Artikel [[Compiler-Version einer Java-Klasse ermitteln]] beschrieben.
  
 
==ClassNotFoundException==
 
==ClassNotFoundException==
Zeile 99: Zeile 147:
  
 
==NullPointerExecption==
 
==NullPointerExecption==
Auch oft anzutreffen, die [[NullPointerException]]. Dieser Ausnahmefehler ist oft auf der Console zu sehen, wenn bspw. eingebundene Resourcen, wie Bilder nicht gefunden wurden und daher Objekte nicht initialisiert werden konnten. Natürlich auch dann, wenn Referenzen auf Objekte noch auf <code>null</code> stehen.
+
Auch oft anzutreffen, die [[NullPointerException]]. Dieser Ausnahmefehler ist oft auf der Console zu sehen, wenn bspw. eingebundene Resourcen, wie Bilder nicht gefunden wurden und daher Objekte nicht initialisiert werden konnten. Natürlich auch dann, wenn [[Referenz|Referenzen]] auf [[Objekt|Objekte]] noch auf <code>null</code> stehen.
  
 
=Links=
 
=Links=
 +
*[[JAR-Datei]]
 
*[[Java-Programme starten - Möglichkeiten]]
 
*[[Java-Programme starten - Möglichkeiten]]
*[[Java-Programm nur einmal starten]]
+
*[[Java Version festlegen]]
 +
*[[Java-Compiler-Level und .class-Datei Versionen (major- und minor version number)]]
  
  

Aktuelle Version vom 18. November 2023, 15:31 Uhr

Autor: Gernot Segieth

Jar-Dateien (Java Archive) sind prinzipiell im Zip-Format komprimierte Dateien, die aber durch spezielle Inhalte erweitert wurden.

Per Doppelklick können von der JVM die in ihnen verpackten Java-Anwendungen ausgeführt werden.

Du hast eine JAR-Datei erzeugt oder erhalten und diese lässt sich nicht per Doppelklick starten? Lösungen zu diesem Problem werden wir im Folgenden besprechen.

Klarstellung: Eine Jar-Datei öffnen und eine Jar-Datei starten, sind zwei grundverschiedene Operationen!

Anwendung oder Bibliothek?

Jar-Dateien fassen in sich geschlossene Anwendungen oder Bibliotheken (Library) zusammen. Während Bibliotheken nicht ausführbar sind und dazu dienen, Funktionalität für ein Programm bereit zu stellen, sind Anwendungen, die in Jar-Dateien gespeichert sind durchaus per Doppelklick ausführbar.

Ist die Jar-Datei nicht per Doppelklick ausführbar, liegt möglicherweise eine Bibliothek vor. Um das zu prüfen, sieht man sich kurzerhand den Inhalt der Jar-Datei mit einem Packprogramm an. Mehr dazu gleich anschließend.

Grundsätzlich müssen wir uns zu aller erst folgende Frage stellen:

Kann nur diese bestimmte Jar-Datei, nicht gestartet werden, oder sind alle Jar-Dateien betroffen?

Problem mit einer bestimmten Jar-Datei

Es ist nur eine Jar-Datei, die nicht startet? Andere Jar-Dateien starten?

Dann kann man zunächst die Jar-Datei untersuchen. Handelt es sich also überhaupt um eine ausführbare Jar-Datei?

Jar-Datei in der Eingabeaufforderung/Terminal starten

Um zu testen, ob eine Jar-Datei zumindest fehlerfrei auf der Kommandozeile starten kann, wird folgender Befehl eingegeben:

java -jar MeinJar.jar

MeinJar.jar bezeichnet dabei die auszuführende Jar-Datei. Zum Aufruf muss man sich bereits in dem Verzeichnis befinden, in welchem die Jar-Datei gespeichert wurde.

Sollte es ein Problem mit der Jar-Datei geben, das die Ausführung verhindert, wird eine Fehlermeldung auf der Console/Eingabeaufforderung/Terminal ausgegeben.

Der erste Schritt bei Problemen mit Jar-Dateien ist also immer, zu prüfen, ob bei der Ausführung Fehler auf der Console ausgegeben werden.

Sollte ein Fehler auf der Kommandozeile ausgegeben werden, führt dieser oft dazu, dass die Jar-Datei nicht starten kann. Fehlende Klassen bzw. fehlende Jar-Dateien, fehlende Resourcen, falsch angegebene Verzeichnisse, JRE-Versionsunterschiede usw.

Mehr zu Fehlermeldungen weiter unten.

Aufbau und Inhalt von META-INF

Damit eine Jar-Datei ausführbar wird, enthält sie, wie bereits oben beschrieben, weitere spezielle Inhalte, die von der JVM ausgelesen und verarbeitet werden können. Im Wesentlichen handelt es sich dabei um das Verzeichnis META-INF bzw. um seinen Inhalt. In diesem Verzeichnis muss die Manifest-Datei enthalten sein. Das Verzeichnis META-INF selbst liegt im Wurzelverzeichnis der Jar-Datei.

[/]
 |__[META-INF]
 |    |__ MANIFEST.MF
 |
 |__[mypackage]
      |__ Main.class

Die Manifest-Datei enthält eine Reihe von Informationen, die der Interpreter für die Ausführung einer Java-Anwendung benötigt.

In der Manifest-Datei müssen, damit eine Java-Anwendung per Jar-Datei ausführbar wird, mindestens folgende Angaben enthalten sein:

Manifest-Version: 1.0
Main-Class: mypackage.Main
<Leerzeile>

Hinter Main-Class verbirgt sich die Klasse, die die main()-Methode enthält und damit die Anwendung starten kann. Die Klasse heißt in diesem (obigen) Beispiel Main.class und liegt im Package mypackage.

Wichtig: Ohne eine Leerzeile am Ende der Manifest-Datei wird die Jar-Datei nicht per Mausklick ausführbar sein!

Dieser Fehler tritt oft nur auf, wenn man die Jar-Datei manuell in der Eingabeaufforderung/Terminal erzeugt hat und die Leerzeile vergessen wurde. Eigentlich alle großen Java-IDEs können ausführbare Jar-Dateien erzeugen und werden diesen Part richtig machen.

Wenn wir externe Bibliotheken, wie bspw. einen Datenbanktreiber oder ein LookAndFeel in unserem Programm benutzen, müssen diese entsprechend im Manifest unserer Jar-Datei eingebunden sein.

Class-Path: ./db/database.jar ./laf/look-and-feel.jar

Daher müsste die Zeile Class-Path: in der Manifest-Datei enthalten sein. In unserem Beispiel sind die eingebundenen Bibliotheken in verschiedenen Verzeichnissen relativ zu unserer Jar-Datei abgelegt.
Der Datenbanktreiber liegt, ausgehend vom Verzeichnis unserer Jar-Datei, eine Verzeichnisebene tiefer, im Verzeichnis db. Die Bibliothek des eingesetzten LookAndFeel liegt, ausgehend vom Verzeichnis unserer Jar-Datei, eine Verzeichnisebene tiefer, im Verzeichnis laf.

Wenn die Bibliotheken für den Java-Interpreter nicht in den in unserer Manifest-Datei bezeichneten Verzeichnissen zu finden sind, wird ein Fehler auf der Console ausgegeben werden und unsere Jar-Datei ist möglicherweise nicht ausführbar.

Generelles Problem mit Jar-Dateien

Es gibt in allen Betriebssystemen Konstellationen, die verhindern, dass eine Jar-Datei nach einem (Doppel-)Klick mit der Maus auf das Dateisymbol startet.

Voraussetzung zum Starten von Jar-Dateien ist eine passende JRE!
  • Ist eine aktuelle JRE installiert? Ältere JREs starten Code von neueren Compilern nicht. Mehr dazu im Kapitel Fehlermeldungen auf der Java-Console im Abschnitt UnsupportedClassVersionError
  • Bei vielen Linux-Distributionen ist bspw. die Jar-Datei mit einem Archivierungsprogramm verknüpft, so dass der Inhalt der Jar-Datei angezeigt wird, statt dass sie gestartet wird.

Verknüpfung mit dem Java-Interpreter

Bei Einsatz bestimmter Komprimierungs- bzw. Archivierungsprogramme, wie bspw. WinRar oder 7Zip, kommt es gelegentlich aufgrund falscher Programmeinstellungen vor, dass diese Programme statt der gewünschten Jar-Datei beim Doppelklick auf eine Jar-Datei gestartet werden. Statt die Jar-Datei der JVM zu überlassen, leitet das Betriebssystem den Aufruf an das Packprogramm weiter, welches nun den Inhalt der Jar-Datei anzeigt.
In den Einstellungen der Programme sollte nun zur Fehlerbehebung der Haken zum Öffnen von Jar-Dateien entfernt werden.

Wenn man die Systemeinstellungen seines Linux-Systems nicht ändern möchte, kann man einen Programmstarter für Java-Programme anlegen. Der Doppelklick auf das angelegte Symbol startet dann das Java-Programm.

Interpreter-Typen

Es gibt zwei verschiedene Java-Interpreter. Zumindest unter Windows. Unter Linux gibt es nur einen Interpreter, dem einerseits in der Kommandozeile auszuführende Java-Programme übergeben werden können. Andererseits kann man in Linux auch Einstellungen im System festmachen, die dann eine Jar-Datei mit Doppelklick, ohne Console starten können.

Unter Windows wurden den Interpretern 2 Einsatzzwecke zugedacht. Will man ein Java-Programm auf der Kommandozeile starten, wird java.exe eingesetzt. Dieser Interpreter erzeugt Ausgaben auf der Java-Console bzw. auf der Kommandozeile, so dass bspw. Java-Fehlermeldungen oder Textausgaben, die im Programm mit System.out.println() erzeugt wurden, auf der Kommandozeile landen.

Wenn man Java-Programme starten möchte, die eine Benutzeroberfläche (GUI) haben, (ohne dass sich eine Consolen öffnet) benutzt man unter Windows javaw.exe. Dieser Interpreter unterdrückt den Start der Kommandozeile.

Für Programmstarts per Doppelklick sollte also die Verknüpfung in der Windows-Registry auf javaw.exe gesetzt sein. Im folgenden Kapitel gehen wir näher darauf ein.

Spezialfall Windows

Schritt 3 - Dateiendung suchen
Schritt 5 - Erweiterung bearbeiten
Schritt 7 - Pfad zur JRE festlegen

Unter Windows kann es passieren, dass die richtige Verknüpfung von JRE und Jar-Datei durch falsche Einstellungen oder versehentliches Neuverknüpfen zerstört wird. Jar-Dateien starten dann auch nicht mehr per Doppelklick.

Das manuelle Beheben des Fehlers durch Eingriff in die Registry gestaltet sich inzwischen mit unter als nicht so trivial, weil mit jeder neuen Windows-Version sich die Struktur der Registry geändert hat.

Mit Hilfe von kleinen Tools wie JarFix oder ExtMan lässt sich das Problem jedoch auf jedem Windows-System prüfen und ggf. reparieren.

  • Schritt 1: Herunterladen des Programms ExtMan
  • Schritt 2: Entpacken und Ausführen des Tools.
  • Schritt 3: In der Liste der auf dem System registrierten Dateiendungen .jar suchen und markieren/selektieren
  • Schritt 4: Auf der rechten Seite den Button Erweiterung bearbeiten klicken
  • Schritt 5: Im Bearbeitungsdialog sollte nun bereits die Aktion open eingetragen sein. Dieser ist nun zu markieren/selektieren. Sollte die Aktion nicht existieren, muss sie angelegt werden. Dazu klicken wir auf Neue Aktion, geben open ein und bestätigen. Anschließend sollte der Bearbeitungsdialog so aussehen, wie im Bild zu Schritt 5.
  • Schritt 6: Dieser Eintrag wird nun bearbeitet. Dazu klicken wir auf den Button Bearbeiten.
  • Schritt 7: Im unteren Textfeld muss der richtige Pfad zur installierten JRE, sowie einige Platzhalter eingetragen sein bzw. werden. Wir prüfen also auf unserem System zunächst, ob der Pfad zur JRE stimmt.
  • Schritt 8: Der hier beispielhafte Pfad sollte so in etwa aussehen: "C:\Program Files (x86)\Java\jre1.8.0_151\bin\javaw.exe" -jar "%1" %*
  • Schritt 9: Die Eingabe wird nun mit Klick auf Speichern übernommen. Auch im jetzt wieder sichtbaren Bearbeitungsdialog bestätigen wir unsere Änderungen mit Speichern.
  • Schritt 10: Windows muss nun neu gestartet werden, damit die Änderungen in der Registry aktiviert werden. Anschließend sollten Jar-Programme wieder mit Doppelklick ausführbar sein.

Fehlermeldungen auf der Java-Console

"Failed to load main class"

Wenn der Interpreter aus irgendeinem Grund die Start-Klasse (Klasse mit der main()-Methode) nicht laden kann, gibt er diese Fehlermeldung aus: "Failed to load main class" Die Ursachen dafür können recht vielfältig sein. Z.B. ein Fehler in der Manifest-Datei. (Siehe Aufbau und Inhalt von META-INF)

NoClassDefFoundError

Wenn eine Klasse beim Kompilieren noch gefunden wurde, aber zur Laufzeit nicht mehr, kommt es zu einem NoClassDefFoundError.

In den meisten Fällen wurden beim Erzeugen der Jar-Datei nicht alle .class-Dateien in die Jar-Datei gepackt. Oder es gibt abhängige Bibliotheken, die im Programm benutzt wurden und nicht in der Manifest-Datei im classpath eingetragen sind, bzw. nicht am Ende des erwarteten Pfades erreichbar sind.

UnsupportedClassVersionError

Der Byte-Code der Class-Dateien (Ergebnis des Kompilierens von Quellcode) ist nicht abwärtskompatibel. Das bedeutet, dass ein Java-Programm, das mit einem aktuellen Compiler kompiliert wurde, nicht auf in einer älteren JVM laufen wird.

Beispiele:

  1. Compiler-Version Java 8 -> JVM-Version Java 7
  2. Compiler-Version Java 7 -> JVM-Version Java 8

Im Beispiel 1 wird ein UnsupportedClassVersionError geworfen. Das bedeutet, dass auf dem Rechner, der das Java-Programm (Jar-Datei) ausführen soll, eine aktuellere JRE installiert werden muss.

Welche Java-Version auf dem Computer installiert ist, erfährt man mit folgendem Befehl auf der Kommandozeile: java -version
Manchmal erhält man eine Fehlermeldung, obwohl Java installiert wurde. Das passiert, wenn die Umgebungsvariablen JAVA_HOME und/oder PATH den Pfad zum Java-Interpreter nicht enthalten.

Wie man ermitteln kann, mit welcher Compiler-Version das vorliegende Programm vom Entwickler kompiliert wurde, ist in unserem Artikel Compiler-Version einer Java-Klasse ermitteln beschrieben.

ClassNotFoundException

Dieser Fehler deutet auf ein Problem beim Laden einer Klasse hin. Sie z.B. tritt auf, wenn der ClassLoader eine Klassendatei nicht finden konnte. Nicht alle, in der Jar-Datei gespeicherten Klassen sind im Classpath.

NullPointerExecption

Auch oft anzutreffen, die NullPointerException. Dieser Ausnahmefehler ist oft auf der Console zu sehen, wenn bspw. eingebundene Resourcen, wie Bilder nicht gefunden wurden und daher Objekte nicht initialisiert werden konnten. Natürlich auch dann, wenn Referenzen auf Objekte noch auf null stehen.

Links


Fragen

Das Thema wurde nicht ausreichend behandelt? Du hast Fragen dazu und brauchst weitere Informationen? Lass Dir von uns helfen!

Wir helfen dir gerne!


Dir hat dieser Artikel gefallen? Oder Du hast Fehler entdeckt und möchtest zur Berichtigung beitragen? Prima! Schreibe einen Kommentar!

Du musst angemeldet sein, um einen Kommentar abzugeben.