Jar lässt sich auf bestimmten Pc nicht starten

Osram127

Mitglied
Hallo!
Ich habe ein Java Projekt in Eclipse fertiggestellt und wolltee es nun gerne als .jar exportieren. Mein Pc auf dem ich das Projekt geschrieben hatte, ist allerdings schon beim jar erstellen gescheitert. Er hat zwar ein jar ohne Fehlermeldung erstellt, dieses konnte er dann aber nicht starten (Ich hab das Exportieren noch 6 mal wiederholt, aber keine Besserung).
Dann hab ich den gleichen Code auf meinem Laptop zu einem jar exportiert, dieses konnte mein Laptop auch wunderbar starten. Dann hab ich mir diese Datei auf meinen anderen Pc gezogen, dort lässt sie sich aber wieder nicht starten. Wie kann das sein? Eigentlich dachte ich, dass jar files auf beliebigen Computern problemlos laufen können. Habt ihr eine Idee, wie ich diese jar Datei noch auf meinem Pc zum laufen kriege?
Ps: Ich habe auf meinem Pc schon 3 andere jars erstellt, diese konnte er ausführen, das geht auch jetzt noch, nur dieses Projekt geht nicht.
 
Beste Antwort
Anstatt das Programm mit der alten Version zu starten, könntest du auch stattdessen den "Fehler" beheben, dann läuft es auch unter Java 14 🙂
[CODE lang="java" highlight="3,4"]
public static void setIcon(JFrame frame) {
try {
Object obj1 = new Object();
URL resource = obj1.getClass().getResource("/ReL/src/img/ugandanknuckFree.png");
BufferedImage image = ImageIO.read(resource);
frame.setIconImage(image);
} catch (IOException e) {
e.printStackTrace();
}
}
[/CODE]

Erstens brauchst du zum Laden der Resource das Class-Objekt – das kannst du direkt nutzen, anstatt die Klasse einer grad erstellten Instanz zu nutzen. obj1.getClass().getResource("/ReL/src/img/ugandanknuckFree.png");...
Da gäbe es einige Möglichkeiten. Kann es z. B. sein, dass Du auf Deinem Rechner verschiedene Java-Versionen hast? Wenn Du zum Entwickeln z. B. Java 11 verwendest, für den "Doppelklick" aber Java 8 verwendet wird, klappt das nicht.

Du kannst mal versuchen, den Spaß per Eingabeaufforderung zu starten: java -jar DeineJar.jar - evtl. weißt Du dann mehr.
 
Und wenn man ein Java Programm weiter geben möchte, dann würde ich auch generell empfehlen, das man kein jar File weiter gibt sondern ein Image erstellt. Also per JLink (ab Java 9 verfügbar) und dann ggf. noch JPackage (ab Java 14 verfügbar).

JLink baut ein Image, das die eigenen Klassen mit allen Abhängigkeiten und dem JRE in einem Verzeichnis zusammen stellt. Gestartet wird es dann über ein erstelltest Script.

JPackage kann das auch noch weiter verarbeiten - dann hast Du das etwas mehr zusammen gepackt und es wird eine EXE gestartet oder Du hast einen Installer, den andere dann installieren können.

Hintergrund dieser Empfehlung ist klar: Es gibt weniger Abhängigkeiten bezüglich des Zielrechners. Da muss man keine Java Installation voraus setzen.
 
Ich habs jetzt mal über die Eingabeaufforderung probiert, da lässt sich das Programm doch tatsächlich ausführen!

Also mein Pc hat die Java Version 1.8.0_271 und mein Laptop 1.8.0_251. Bei Eclipse benutze ich JDK 1.8.

Jetzt verstehe ich aber nicht, warum der Doppelklick bei der etwas neueren Version nichts bewirkt, auf meinem Laptop mit der etwas älteren aber schon... Und warum funktioniert das Programm plötzlich über die Eingabeaufforderung ohne Probleme?
 
Das sind verschiedene Dinge. Vermutlich ist die Erweiterung .jar einfach mit einem anderen Programm verknüpft.

Tipp mal in der Eingabeaufforderung
Code:
assoc .jar
ein. Das sollte etwas wie jarfile rauskommen. Dann tippst Du anschließend
Code:
ftype jarfile
ein (jarfile natürlich ggf. ersetzen). Dort solltest Du dann sehen, was beim Doppelklick ausgeführt wird.
 
Also bei "assoc .jar" kommt ".jar=jarfile" raus und bei "ftype Fehlerprogramm.jar" kommt "Dateityp "Fehlerprogramm.jar" nicht gefunden, oder diesem Dateityp wurde kein Öffnen-Befehl zugeordnet." raus. ("Fehlerprogramm" ist die jar um die es geht)
Was bedeutet das jetzt?😅
 
OK, und was passiert, wenn Du Dein jar mit dem dort angegebenen Java aufrufst? Kann es sein, dass Du ein JavaFX-Programm geschrieben hast?

Code:
"C:\Program Files\Java\jdk-14.0.2\bin\java" -jar meineJar.jar
 
Dann gibt die Konsole

Java:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
        at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1400)
        at ReL.src.rechnerOberflaeche.Launcher.setIcon(Launcher.java:81)
        at ReL.src.rechnerOberflaeche.Launcher.<init>(Launcher.java:37)
        at ReL.src.rechnerOberflaeche.Main.main(Main.java:7)
aus.

Das Programm besteht aus einigen GUIs, die ich mit javax.swing geschrieben habe.
 
Zuletzt bearbeitet:
Ja sry falsches Verzeichnis, habs jetzt verbessert.
Falls es wichtig ist, die setIcon Methode sieht so aus:
Java:
public static void setIcon(JFrame frame) {
        try {
            Object obj1 = new Object();
            URL resource = obj1.getClass().getResource("/ReL/src/img/ugandanknuckFree.png");
            BufferedImage image = ImageIO.read(resource);
            frame.setIconImage(image);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
Zuletzt bearbeitet:
Dann findet er gewisse Resourcen nicht. Du versuchst ein Bild von der Platte zu lesen - ist das mit in das Jar gepackt? Wenn ja, dann musst du im Programm getResourceAsStream nutzen, wenn nein, musst es passend neben dem Jar liegen.
 
Ne, sieht so schon ok aus. Allerdings ist der Pfad vermutlich Falsch. Der korrekte dürfte "/img/ugandanknuckFree.png" lauten - du kannst mal in das Jar reinschauen (ist ja nur eine ZIP-Datei) wo das liegt.
 
Tatsächlich ist das Verzeichnis richtig, das package ist ein bisschen komisch benannt, da ich das irgendwann mal in mein Projekt importiert habe. So kann ich das Programm auch in Eclipse testen, wenn der Pfad falsch wäre, dürfte dies ja auch nicht möglich sein.

Die Zeile 81 (Welche in der Fehlermeldung steht) ist in der Methode die Zeile 5, also scheint da irgendwas im jar nicht zu funktionieren... Aber was?

Ich verstehe jetzt halt nicht, warum mir die Konsole jetzt eine Fehlermeldung ausspuckt, das Programm aber als Eclipse Projekt immer funktioniert hat und auch als ich es vorhin über die Konsole gestartet hatte (In Beitrag #4)
 
Zuletzt bearbeitet:
Ich habe den Befehl "C:\Program Files\Java\jdk-14.0.2\bin\java" -jar meineJar.jar jetzt mal in "C:\Program Files\Java\jre1.8.0_271\bin\java" geändert. Dann wurde das Programm wieder ausgeführt. Anscheinend kann das Programm also nicht mit der jdk 14.0.2 umgehen. Kann ich das irgendwie umstellen, dass das jar immer beim Doppelklick mit der jre 1.8.0_271 gestartet wird?
 
Anstatt das Programm mit der alten Version zu starten, könntest du auch stattdessen den "Fehler" beheben, dann läuft es auch unter Java 14 🙂
[CODE lang="java" highlight="3,4"]
public static void setIcon(JFrame frame) {
try {
Object obj1 = new Object();
URL resource = obj1.getClass().getResource("/ReL/src/img/ugandanknuckFree.png");
BufferedImage image = ImageIO.read(resource);
frame.setIconImage(image);
} catch (IOException e) {
e.printStackTrace();
}
}
[/CODE]

Erstens brauchst du zum Laden der Resource das Class-Objekt – das kannst du direkt nutzen, anstatt die Klasse einer grad erstellten Instanz zu nutzen. obj1.getClass().getResource("/ReL/src/img/ugandanknuckFree.png"); ist in dem Fall äquivalent zu Object.class.getResource("/ReL/src/img/ugandanknuckFree.png");.
Zweitens solltest du zum Laden der Resourcen eine eigene Klasse nutzen, und keine aus dem JDK selbst – also statt Object die Klasse, in der die Methode deklariert ist – wenn deine Klasse "MeineKlasse" heißt also MeineKlasse.class.getResource("/ReL/src/img/ugandanknuckFree.png");.
 
Beste Antwort

Zurück
Oben