Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält?

Thomasneuling

Mitglied
Ich nutze Intelij ultimate.

Ich habe ein Javaprojekt, wo ich ein bestimmtes Package, welches das GUI Fenster für eine Application darstellt, in eineJar machen will, da will ich alle Java Dateien, alle JavaFx-Klassen, alle Java-Controllerklassem alle FXML Dateien, alle Bilder, Alle Sounds und alle CSS Dateien nehmen, damit man die vollständige GUI als Jar hat.

Da wollte ich nun fragen, wie das geht? Die FXMl, Css, FXML und Sounds (Also Mp3-Dateien), befinden sich im Ressourcen Ordner und die Javafx, sowie die normalen Javaklassen, befinden sich in einem Package unter Java?

Ist das einfach oder hat man da was zu beachten?
 
Beste Antwort
Danke, ich muss eine Jar erstellen, da das die Abgabe verfplichtet.
Ok, wenn das die Anforderung ist, dann muss das wohl sein. Aber ich finde das gerade sehr irritierend. Was ist denn da das Ziel? Da muss es dann doch irgendwelche Vorgaben geben, was genau wie zu machen ist. Ist für mich nicht gerade nachvollziehbar, aber ok:

Die Plugins werden mit entsprechender Konfiguration in der pom eingetragen. Das sieht dann z.B. so aus:

Für die Eintragung der Main-Class:
XML:
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <archive>...
Wenn Du Maven nutzt, dann kannst Du Abhängigkeiten mit in die JAR Datei packen so Du wirklich über ein JAR gehen willst. (Das ist aber alles pre Java 9 und bringt diverse Probleme mit sich. Damit die JAR Datei läuft ist halt eine passende Java Installation notwendig.

Ein Ansatz dazu wäre das maven shade Plugin. Damit JavaFX funktioniert wirst Du vermutlich auch noch eine separate Klasse mit main Methode haben. Die main Methode in der Klasse, die von Application erbt wird leider nicht funktioniern.

Mein Tipp hier wäre aber tatsächlich der Bau eines Images, welches dann auch eine Java Runtime enthält. Dann hast du bei deiner Anwendung alles dabei, was du brauchst.
 
Danke dir Konrad, bin leider ein totaler Anfänger in diesem Bereich. Was genau heißt Bau eines Images ? Und es gibt keine Möglichkeit eine Jar zu erstellen für Java19 ? Muss das für eine Abgabe machen.
 
Zuletzt bearbeitet:
Ich habe jetzt bei Intelij ein Jar erstellt, über Artifakte, bei prijectstructure und build gedrückt, beim Ausführen über cmd kommt der Fehler: Zum ausführen dieser Anwendung JavaFx Runtime Komponenten fehlen, was kann ich da tun? Habe ja Javafx mit Maven.

Aber auf Intelij kann ich das Projekt problemlos startenö
 
Zuletzt bearbeitet:
Wenn Du Maven nutzt, dann solltest Du nicht diese Artifakte von IntelliJ nutzen. IntelliJ bietet halt einige eigene Möglichkeiten zur Projektverwaltung, aber Du willst ja Maven zur Verwaltung des Projektes nutzen. Daher rate ich Dir davon ab - auch wenn ich jetzt da mögliche Lösungen anbiete.

beim Ausführen über cmd kommt der Fehler: Zum ausführen dieser Anwendung JavaFx Runtime Komponenten fehlen, was kann ich da tun?
Da gibt es zwei mögliche Fehlerquellen:
a) Die Abhängigkeiten sind nicht mit in das JAR eingeflossen. Das müsste man ggf. prüfen.
b) Wenn die JavaFX Libraries einfach auf dem Classpath sind, dann gibt es Probleme bei der Initialisierung, wenn die Startklasse direkt eine JavaFX Klasse nutzt. Dies ist oft der Fall, denn die main Methode ist meist in einer Klasse, die von Application erbt und die dann in der main Methode einfach launch aufruft. Ein einfacher Workaround ist eine weitere Klasse nur mit einer main Methode, die dann diese andere main Methode aufruft. Ein Beispiel findet sich z.B. unter https://github.com/kneitzel/JavaFXMavenApp/blob/main/src/main/java/de/kneitzel/Main.java

Wenn Du es rein über Maven machen willst (empfohlen), dann gibt es da mehrere Möglichkeiten:
- Nicht gut: Du baust ein jar File, das ausführbar ist und alle Abhängigkeiten enthält. Dazu kann man dann z.B. ein Manifest hinterlegen und mittels shade Plugin die Abhängigkeiten einbinden. Das wäre dann das, was Du mit dem Artifakt in IntelliJ gemacht hast.

- Besser: Du baust wirklich ein App-Image. Dazu musst Du Java 14 oder höher haben und das Ergebnis ist dann nicht einfach ein jar sondern eine Verzeichnisstruktur mit einem Binary und die Verzeichnisse enthalten wirklich alles, was Du brauchst. Wenn Du es weiter gibst, dann muss man da nichts groß installieren. Da wird dann kein Java benötigt oder so!
Vorgehen: Entweder das Projekt, das Du schon jetzt hast, anpassen oder einfach das JavaFXMavenApp Projekt herunter laden, die POM anpassen und das src Verzeichnis komplett austauschen. Das letztere hat den Vorteil, dass Du gleich mehrere Dinge bekommst wie statische Codeanalyse und co. So Du nur ein minimales, kleines pom hast ohne große Anpassungen, dann ist Letzteres am Einfachsten.

Dabei kann ich Dir auch gerne generell helfen. Wenn es da Probleme gibt, kannst Du z.B. deine POM posten und dann bekommst Du eine Anpassung von mir mit den Dingen, die notwendig sind.
 
Wenn Du Maven nutzt, dann solltest Du nicht diese Artifakte von IntelliJ nutzen. IntelliJ bietet halt einige eigene Möglichkeiten zur Projektverwaltung, aber Du willst ja Maven zur Verwaltung des Projektes nutzen. Daher rate ich Dir davon ab - auch wenn ich jetzt da mögliche Lösungen anbiete.


Da gibt es zwei mögliche Fehlerquellen:
a) Die Abhängigkeiten sind nicht mit in das JAR eingeflossen. Das müsste man ggf. prüfen.
b) Wenn die JavaFX Libraries einfach auf dem Classpath sind, dann gibt es Probleme bei der Initialisierung, wenn die Startklasse direkt eine JavaFX Klasse nutzt. Dies ist oft der Fall, denn die main Methode ist meist in einer Klasse, die von Application erbt und die dann in der main Methode einfach launch aufruft. Ein einfacher Workaround ist eine weitere Klasse nur mit einer main Methode, die dann diese andere main Methode aufruft. Ein Beispiel findet sich z.B. unter https://github.com/kneitzel/JavaFXMavenApp/blob/main/src/main/java/de/kneitzel/Main.java

Wenn Du es rein über Maven machen willst (empfohlen), dann gibt es da mehrere Möglichkeiten:
- Nicht gut: Du baust ein jar File, das ausführbar ist und alle Abhängigkeiten enthält. Dazu kann man dann z.B. ein Manifest hinterlegen und mittels shade Plugin die Abhängigkeiten einbinden. Das wäre dann das, was Du mit dem Artifakt in IntelliJ gemacht hast.

- Besser: Du baust wirklich ein App-Image. Dazu musst Du Java 14 oder höher haben und das Ergebnis ist dann nicht einfach ein jar sondern eine Verzeichnisstruktur mit einem Binary und die Verzeichnisse enthalten wirklich alles, was Du brauchst. Wenn Du es weiter gibst, dann muss man da nichts groß installieren. Da wird dann kein Java benötigt oder so!
Vorgehen: Entweder das Projekt, das Du schon jetzt hast, anpassen oder einfach das JavaFXMavenApp Projekt herunter laden, die POM anpassen und das src Verzeichnis komplett austauschen. Das letztere hat den Vorteil, dass Du gleich mehrere Dinge bekommst wie statische Codeanalyse und co. So Du nur ein minimales, kleines pom hast ohne große Anpassungen, dann ist Letzteres am Einfachsten.

Dabei kann ich Dir auch gerne generell helfen. Wenn es da Probleme gibt, kannst Du z.B. deine POM posten und dann bekommst Du eine Anpassung von mir mit den Dingen, die notwendig sind.
Danke, ich muss eine Jar erstellen, da das die Abgabe verfplichtet.

Leider darf ich die Pom nicht hochladen 🙁, wie funktioniert dieses plugin? Also ich muss ein shade plugin holen, dann in die dependency wahrscheinlich tun und dann im lifecyle was anklicken, aber habe da leider keine Ahnung. Hab jetzt auf Stack Sachen gesucht, aber irgendwie mehrere Varianten gefunden.
 
Danke, ich muss eine Jar erstellen, da das die Abgabe verfplichtet.
Ok, wenn das die Anforderung ist, dann muss das wohl sein. Aber ich finde das gerade sehr irritierend. Was ist denn da das Ziel? Da muss es dann doch irgendwelche Vorgaben geben, was genau wie zu machen ist. Ist für mich nicht gerade nachvollziehbar, aber ok:

Die Plugins werden mit entsprechender Konfiguration in der pom eingetragen. Das sieht dann z.B. so aus:

Für die Eintragung der Main-Class:
XML:
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>your.package.MainClass</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

Um alle Abhängigkeiten einzubauen könnte man das shade plugin verwenden:
XML:
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.4.1</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

Das ist jetzt ein Beispiel - das Shade Plugin kann aber noch stark konfiguriert werden. Das ist mit etwas Glück aber nicht notwendig.

Wichtige Dinge sind aber ggf:
  • Filtern von Dateien (Wenn eine Abhängigkeit signiert ist, dann muss z.B. die Signatur entfernt werden)
  • Wenn Du diverse Services mit einbindest, dann ist in der Regel ein ServicesResourceTransformer notwendig
  • ...

Die Dokumentation zeigt viele Dinge auf, die möglich sind. https://maven.apache.org/plugins/maven-shade-plugin/index.html
 
Beste Antwort
Ok, wenn das die Anforderung ist, dann muss das wohl sein. Aber ich finde das gerade sehr irritierend. Was ist denn da das Ziel? Da muss es dann doch irgendwelche Vorgaben geben, was genau wie zu machen ist. Ist für mich nicht gerade nachvollziehbar, aber ok:

Die Plugins werden mit entsprechender Konfiguration in der pom eingetragen. Das sieht dann z.B. so aus:

Für die Eintragung der Main-Class:
XML:
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>your.package.MainClass</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

Um alle Abhängigkeiten einzubauen könnte man das shade plugin verwenden:
XML:
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.4.1</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

Das ist jetzt ein Beispiel - das Shade Plugin kann aber noch stark konfiguriert werden. Das ist mit etwas Glück aber nicht notwendig.

Wichtige Dinge sind aber ggf:
  • Filtern von Dateien (Wenn eine Abhängigkeit signiert ist, dann muss z.B. die Signatur entfernt werden)
  • Wenn Du diverse Services mit einbindest, dann ist in der Regel ein ServicesResourceTransformer notwendig
  • ...

Die Dokumentation zeigt viele Dinge auf, die möglich sind. https://maven.apache.org/plugins/maven-shade-plugin/index.html
Bei der Variante muss ich jedoch einen Pfad noch zur JavaFx SDK geben, weil er sonst sagt, dass die javafx run kompinente fehlt, also habe javafx sdk runtergeladen und bevor ich über die konsole direkt java -jar xxx.jar eingebe, muss ich dann noch den Pfad zum lib Ordner geben und die Module in der Konsole mit einspielen, gibt es eine Möglichkeit, dass ich das nicht machen muss?
 
a) Hast Du die Maven Abhängigkeiten alle in Maven eingetragen?
b) Hast Du diese zusätzliche Klasse mit der main Methode gemacht?

Wenn Du beides gemacht hast, dann sollte es funktionieren.
 
Ich habe heute den Ansatz den Konrad bereitgestellt hat, ebenfalls getestet, bei mri ist es nun so, windows nutzer können die jar per doppelklick ausführen, mac und linux nutzer nur, wenn sie diese über dei konsole laufen lassen, gibts dafür ein fix?
Also Windowsnutzer machen einfach Doppelklick und es geht, bei Linux und Mac Usern, muss man im Terminal die Jar Datei mit java - jar JarName.jar ausführen, kann man auch irgendwie mit maven einstellen, dass das per Doppelklick auch für die geht?
 
Man sollte halt generell keine jar Datei bereitstellen sondern Binaries, die gestartet werden können.

Dazu dient JPackage.

Ansonsten habe ich keine Ahnung, wie das mit der jar Datei in Linux und macOS zu konfigurieren ist. Die jar Datei ist ja anscheinend ok, wenn der Aufruf auf der Kommandozeile funktioniert.
 

Zurück
Oben