JavaFX Maven Projekt als .exe Datei exportieren

GregDev

Mitglied
Hallo liebes Forum,
bin neu hier, also erstmal schön, dass es dieses Forum gibt. Meine letzte Hoffnung.

Ich habe ein JavaFX Projekt mittels Maven auf IntelliJ erstellt. Funktioniert wie ne Eins. Ich konnte das Projekt auch mit jlink exportieren. Bis hier hin also kein Problem.

Jetzt möchte ich aber eine einzelne .exe Datei haben, in der alles enthalten ist, sowohl die Runtime-Komponenten als auch die benötigten JavaFX Module. Ich weiß es gibt tausende Suchergebnisse auf Google, aber irgendwie funkt es bei mir nie.
Mir fehlt ja eigentlich nur noch der letzte Schritt, von jlink zu einer .exe zu kommen.

Ich würde mich über Hilfe freue und wünsche euch noch nen' sonnigen tollen Tag ;-) .

(Ich wusste nicht ob das Thema zu "JavaFX" gehört, wahrscheinlich schon, aber ist irgendwie auch was Allgemeines. Hoffe es ist ok. Wenn es falsch ist entschuldige ich mich.)
 
Ab Java 14 gibt es JLink, das kann dir eine exe erzeugen, aber es wird immer noch paar zusätzliche Dateien geben.

Das lässt sich auch in Maven automatisiert mit aufrufen.
 
Danke für deine Antwort!
Ich habe JLink einmal durchlaufen lassen. im target Ordner wurde das JLink image erstellt. In dem bin Ordner wurde folgende Anwendungen erstellt: java, javaw, jrunscript und keytool. All diese starten nur kurz die Kommandozeile und schließen sich darauf wieder. Es wurdeauch ein Launch Script erstellt lauch.bat, aber dieser funktioniert nur in Zusammenhang mit den anderen Dateien. Ist nicht so Nutzerfreundlich alle Dateien komprimiert als Zip weiterzugeben, deswegen wollte ich eine exe haben. Auf Mac konnte ich das Problem ziemlich leicht lösen, aber auf Windows leider nicht.
 
Eine stand alone EXE ist mit dem JDK nicht möglich. Ein weitergehender Schritt ist JPackage. Dabei wird das aus dem JLink Image entweder ein App-Image gebaut (dann hat man eine exe, die man ausführen kann. Aber die Verzeichnisstruktur / anderen Dateien braucht man weiterhin) oder ein MSI um das JLink-Image zu installieren.

Eine weitere Option, die man sich anschauen könnte: GraalVM - Da wird ggf. eine einzelne EXE erzeugt. Da bin ich mir aber jetzt nicht sicher - ich habe es mir noch nicht so genau angesehen.
 
Eine stand alone EXE ist mit dem JDK nicht möglich. Ein weitergehender Schritt ist JPackage. Dabei wird das aus dem JLink Image entweder ein App-Image gebaut (dann hat man eine exe, die man ausführen kann. Aber die Verzeichnisstruktur / anderen Dateien braucht man weiterhin) oder ein MSI um das JLink-Image zu installieren.

Eine weitere Option, die man sich anschauen könnte: GraalVM - Da wird ggf. eine einzelne EXE erzeugt. Da bin ich mir aber jetzt nicht sicher - ich habe es mir noch nicht so genau angesehen.
Wie könnte man eine javafx app eigenständig machen wenn der rechner auf dem es laufen sollte keine internet verbindung hat? Dann würde es ja schlecht gehen mit maven oder?
 
maven in eclipse braucht ansich auch kein internet wenn du die pakete schon hast

zb eclipse lädt sie in den .m2 ordner der versteckt ist und referenziert die pakete
wenn du dir neue pakete von maven holst lädt sie eclipse da rein

zum aktualisieren brauchst du halt internet
 
Den Punkt mit GraalVM habe ich ansonsten auch noch einmal etwas ausprobiert. Und das ist übrigens auch eine gute Lösung.

Voraussetzungen:
  • GraalVM mit Native-Image (siehe Homepage)
  • Das JavaFX ist etwas blöd mit dem Classloader. Da kann es Probleme geben, wenn die Klasse mit der Main Methode zugleich von Application erbt. Daher habe ich eine einfache Klasse mit einer main Methode, die einfach die andere main Methode aufruft.

Was ich gemacht habe:
a) Die Abhängigkeiten habe ich mir in ein Verzeichnis geschrieben.
XML:
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>${maven.dependency.plugin}</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/modules</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

b) Das wird dann einfach per native-image zusammen gebaut. Bei mir war alles (incl. dem jar der Projekts) in modules, so dass ein
native-image -cp "./modules/*" package.Main
ausreichte um dann ein einzelnes Binary zu haben, das problemlos funktioniert.

Das ist also durchaus eine gangbare Lösung. Das mit der separaten Klasse für die main müsste man sich evtl. noch etwas ansehen, aber das wäre so als erster Schritt doch schon einmal nicht schlecht - und nur mit minimalem Aufwand verbunden.
 

Neue Themen


Zurück
Oben