Wie JavaFX-Projekt OHNE Maven, Gradle zu JAR?

1 Antwort

Dabei hab ich nicht mit Maven, Gradle, (...) gearbeitet, da ich Probleme hatte, damit umzugehen (...)

Sowohl für Maven als auch für Gradle gibt es in der Dokumentation einen Guide zur Schritt-für-Schritt-Einrichtung. Wie man dazu dann mit Gradle noch eine Fat-JAR erstellt, habe ich vor ungefähr zwei Jahren in diesem Beitrag einmal beschrieben. Bezüglich Maven findest du hier eine Anleitung.

Generell würde ich die Projektverwaltung via Gradle/Maven/o.ä. als den bevorzugten Weg bezeichnen. Es bedarf zwar auch etwas Einarbeitung, doch letzten Endes vereinfacht es die Verwaltung von Abhängigkeiten sowie einen Build.

Denn beim Ausführen des Produkts passiert nichts.

Führe die JAR am besten über die Konsole (Eingabeaufforderung/Terminal) aus. Möglicherweise gibt es eine Fehlermeldung, die dir sonst entgeht.

java -jar "PATH/TO/YOUR/APP.jar"

Wenn deine JAR kein Manifest enthält, welches eine Startklasse festgelegt hat, müsstest du stattdessen die cp-Option nutzen.

java -cp "PATH/TO/YOUR/APP.jar" your.package.MainClass

Das heißt, du gibt der java.exe an, dass sie eine Klasse ausführen soll, die sie in der JAR-Datei finden kann. Für die Angabe der Klasse benötigst du den vollen Spezifier bestehend aus Package- und Klassennamen. In meinem Beispiel würde die Klasse MainClass innerhalb des Package your.package gesucht werden.

(...) Java-Tools wie javapackager oder jpackage (...)

Das javapackager-Tool wurde durch jpackage bereits abgelöst. Mit jpackage baust du letzten Endes keine JAR-Dateien, sondern steckst bereits existierende JAR-Dateien in einen Container (exe, msi, dmg, o.ä.).

Denn ich habe auch keine xml- oder fxml-Dateien.

Du brauchst weder FXML- noch XML-Dateien. Beide Packager könntest du ja genauso gut auch benutzen, um Nicht-JavaFX-Projekte zu einem Bundle zu packen.

(...) allerdings verstehe ich nicht, wie diese zu verwenden sind.

Konzentriere dich erst einmal darauf, überhaupt eine ausführbare JAR-Datei zu deinem Projekt zu erstellen. In der Konsole kannst du das mit der jar.exe durchführen.

Prüfe dazu, ob dem System das jar-Tool in der Konsole (Eingabeaufforderung/Terminal) überhaupt schon bekannt ist.

jar --version

Im Erfolgsfall sollte dir eine Versionsnummer ausgegeben werden. Wenn der Befehl hingegen nicht gefunden wird, kannst du dich an meinen Guide aus diesem älteren Beitrag halten. Oder aber du gibst einfach immer den vollen Pfad zur jar.exe an. Sie sollte im Installationsverzeichnis deines JDK liegen.

Beispiel:

"C:\Program Files\Java\YourJDKVersion\bin\jar.exe" --version

Im Anschluss kannst du in dein Verzeichnis wechseln und die JAR bauen lassen.

cd "path/to/your/project/directory"
jar cvmf manifest.txt output.jar *

Bezüglich der Bestandteile des jar-Befehls:

  • c gibt an, dass eine JAR-Datei erstellt werden soll
  • v gibt an, dass begleitend zum Build-Prozess Ausgaben in der Konsole getätigt werden sollen, so kannst du mitverfolgen, was alles in deine JAR hineingepackt wird
  • m gibt ein Manifest (manifest.txt) an. Ein Manifest dient dazu, Metainformationen (z.B. Appname, -version und Beschreibung) oder die Startklasse festzulegen. Daran kann sich die JRE bei Ausführung der JAR später orientieren. In einer minimalen manifest.txt könnte folgender Inhalt stehen:
Manifest-Version: 1.0
Main-Class: yourPackage.YourMainClass
  • f gibt an, dass das Ergebnis in eine Datei (output.jar) gepackt werden soll
  • * gibt an, dass alle Dateien im Verzeichnis in die JAR hinein sollen. Das wäre soweit eine fixe, oberflächliche Lösung, die aber auch die Datei größer macht, als sie sein müsste. Im Prinzip brauchst du ja nur die .class-Dateien und evt. noch Ressourcen. Statt einem Sternchen kannst du daher ebenso Ordner- und Dateinamen auflisten. Ordner werden mit ihrem gesamten Inhalt in die JAR kopiert.

Beispiele:

jar cvf output.jar Main.class images

Hier wird eine JAR-Datei erstellt, die eine Main-Klasse und einen Ordner images mitsamt seinem Inhalt aufnimmt.

jar cvf output.jar *.class images

In diesem Fall wird eine JAR-Datei erstellt, die alle .class-Dateien aus dem aktuellen Verzeichnis (nicht aus dessen Unterverzeichnissen) in die JAR kopiert.

Weiteres zum jar-Befehl kannst du übrigens in der Tutorials-Serie von Oracle nachlesen. Nach dem Build würde ich empfehlen, die produzierte JAR über die Konsole zu starten (s.o.). Ebenfalls kannst du die JAR-Datei mit einem ZIP-Tool (z.B. 7-zip oder WinRAR) öffnen und gegenprüfen, ob sie die Dateien so enthält, wie erwartet.

Sofern das klappt, kannst du anschließend mit dem jpackage-Tool weiterarbeiten. Je nachdem, was für einen Container du erzeugen möchtest, müsstest du dir zuvor noch Software installieren (lies hier). Für eine exe-Datei für Windows brauchst du beispielsweise das Wix Toolset.

Da das jpackage-Programm im selben Ordner wie auch die jar.exe liegt, kannst du es in der Konsole entweder via jpackage oder über den kompletten Dateipfad aufrufen.

Ein einfaches Beispiel könnte so aussehen:

jpackage --input "path/to/jar-folder" \
  --name MyApp \
  --main-jar output.jar \
  --type exe
  • --input entspricht dem Verzeichnis, in dem die JAR-Dateien liegen, die in den Container sollen
  • --name ist der Name deiner Anwendung
  • --main-jar entspricht der JAR-Datei, die den Startpunkt der Anwendung enthält
  • --type ist der Containertyp, je OS gibt es verschiedene Optionen (exe, dmg, etc.)

Weitere Optionen werden im Manual aufgelistet. Ansonsten findest du hier auch die volle Dokumentation zu dem Tool.