JavaFX applikation auf anderen Systemen zum laufen bringen

N

nieselfriem

Bekanntes Mitglied
Hallo,

ich habe nach einiger Abstinenz mich wieder mal Java zugewendet. Nun habe ich mich etwas auf JavaFX gestürzt und mir mein Intellij da eingerichtet um mich mal der Destoptoolentwicklung hinzugeben.

Nun habe ich aber das Problem, dass ich gerne meine kleine "Anwendung" auf einem anderen System laufen lassen will. Nun scheitere ich daran, dass ich unter Windows entwickelt habe, dort JavaFX installiert habe und die Anwendung mal unter einem Linux laufen lassen wollte. Nun scheitere ich an einer
Code:
java.lang.ClassNotFoundException: com.sun.glass.ui.gtk.GtkPlatformFactory

Gibt es eine Möglichkeit JavaFX Anwendungen so im Artefakt zusammenzubauen, dass ich JavaFX nicht explizit unter dem Zielsystem installieren muss?

VG Georg
 
kneitzel

kneitzel

Top Contributor
Nur kurz am Rande:
Ich habe die Lösung dort etwas ausprobiert und es scheint schon halbwegs zu funktionieren.

Mein Gradle.build file:
Java:
plugins {
    id 'java'
}

group 'de.kneitzel'
version '1.0-SNAPSHOT'
ext.moduleName = 'HelloWorld.main'
sourceCompatibility = 1.11

repositories {
    mavenCentral()
}

def currentOS = org.gradle.internal.os.OperatingSystem.current()
def platform
if (currentOS.isWindows()) {
    platform = 'win'
} else if (currentOS.isLinux()) {
    platform = 'linux'
} else if (currentOS.isMacOsX()) {
    platform = 'mac'
}

dependencies {
    compile "org.openjfx:javafx-base:11:${platform}"
    compile "org.openjfx:javafx-graphics:11:${platform}"
    compile "org.openjfx:javafx-controls:11:${platform}"
    compile "org.openjfx:javafx-fxml:11:${platform}"
}

task run(type: JavaExec) {
    classpath sourceSets.main.runtimeClasspath
    main = "helloworld.HelloWorld"
}

jar {
    inputs.property("moduleName", moduleName)
    manifest {
        attributes('Automatic-Module-Name': moduleName)
    }
}

compileJava {
    inputs.property("moduleName", moduleName)
    doFirst {
        options.compilerArgs = [
                '--module-path', classpath.asPath,
                '--add-modules', 'javafx.controls,javafx.fxml'
        ]
        classpath = files()
    }
}

task createJar(type: Copy) {
    dependsOn 'jar'
    into "$buildDir/libs"
    from configurations.runtime
}

Was er noch nicht ganz macht ist das gradle.run - da muss ich den module-path richtig angeben ... und das jar ist noch kein fat jar, so dass da noch ein Aufruf mit der Angabe des module-path erfolgen muss:
java --module-path "." --module "HelloWorld.main/helloworld.HelloWorld"

Aber das schaue ich mir morgen noch etwas an - werde ich dann auch noch in meinen Blog mit aufnehmen.

Das ganze Test-Projekt findet sich auf https://github.com/kneitzel/blog-javafx-series unter "xx helloworld - gradle with fatjar". Aber ist halt noch work in progress. Vor allem will man ja auch etwas haben, das unter allen Plattformen funktioniert und so wie ich es sehe, funktioniert es derzeit nur auf der Plattform, auf der es auch gebaut wurde .. Aber das war jetzt auch nur ein paar Minuten Try ehe es für mich ins Bett geht :)
 
kneitzel

kneitzel

Top Contributor
Also ich habe jetzt eben noch einmal geschaut und der erste Ansatz war Müll (Ja, mir gehen im Bett manchmal so Dinge durch den Kopf...)

Java geht hier ja einen speziellen Weg und den sollten wir nicht unbedingt verlassen:

a) gradlew assemble -> Hier bekommen wir ja unter build/distribution ein tar und ein ZIP, welches die Anwendung enthält. Dieses enthält die notwendigen Jars zusammen mit Startscripts, die dann für Windows, Linux und Mac verwendet werden können. Die Dependencies werden aber nur für die eigene Plattform hinzu gefügt (also bei mir: win). Damit man aber alle Plattformen hat, kann man dies in den Dependencies explizit angeben:
Java:
    compile group: 'org.openjfx', name: 'javafx-controls', version: '11.0.2', classifier: 'win'
    compile group: 'org.openjfx', name: 'javafx-fxml', version: '11.0.2', classifier: 'win'

    compile group: 'org.openjfx', name: 'javafx-controls', version: '11.0.2', classifier: 'mac'
    compile group: 'org.openjfx', name: 'javafx-fxml', version: '11.0.2', classifier: 'mac'

    compile group: 'org.openjfx', name: 'javafx-controls', version: '11.0.2', classifier: 'linux'
    compile group: 'org.openjfx', name: 'javafx-fxml', version: '11.0.2', classifier: 'linux'
Das Ergebnis ist dann etwas aus mehreren Dateien, die man auf allen drei Systemen entpacken und starten kann. Für den Start benötigt das Zielsystem lediglich eine passende Java Version.

gradle.build für javafx:
plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.8'
}

javafx {
    version = "11.0.2"
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

group 'de.kneitzel'
version '1.0-SNAPSHOT'

mainClassName = 'helloworld.HelloWorld'

repositories {
    mavenCentral()
}

dependencies {
//    Nur die eigene Plattform:
//    compile group: 'org.openjfx', name: 'javafx-controls', version: '11.0.2'
//    compile group: 'org.openjfx', name: 'javafx-fxml', version: '11.0.2'

//  JavaFX Plattform: Windows
    compile group: 'org.openjfx', name: 'javafx-controls', version: '11.0.2', classifier: 'win'
    compile group: 'org.openjfx', name: 'javafx-fxml', version: '11.0.2', classifier: 'win'

//  JavaFX Plattform: Mac
    compile group: 'org.openjfx', name: 'javafx-controls', version: '11.0.2', classifier: 'mac'
    compile group: 'org.openjfx', name: 'javafx-fxml', version: '11.0.2', classifier: 'mac'

//  JavaFX Plattform: Linux
    compile group: 'org.openjfx', name: 'javafx-controls', version: '11.0.2', classifier: 'linux'
    compile group: 'org.openjfx', name: 'javafx-fxml', version: '11.0.2', classifier: 'linux'
}

Details finden sich auch auf https://openjfx.io!

b) jlink ist das Tool, welches dazu dient ein komplettes Image incl. JRE und allen Java-Modulen, die gebraucht werden, zu erzeugen. Und dieses Tool lässt sich auch sehr schön nutzen mit gradle, indem man das plugin einfügt.
Dadurch wird dann in build/image alles abgelegt, was benötigt wird. Und das wird jetzt natürlich wieder Plattform spezifisch, denn das JRE wird ja kopiert. Und das ist auch mit der Grund, wieso das mit den Dependencies für alle Plattformen weg muss - daran stört sich jlink, denn erkennen tut es die einzelnen Plattformen alle und meckert dann entsprechend.
Ein Cross-Plattform bauen ist auch möglich. Das habe ich aber mit gradle zusammen noch nicht gemacht. Da benötigt man halt ein JDK der Plattform und muss dann --module-path $TARGET/jmods beim jlink Aufruf angeben mit $TARGET dem JDK Verzeichnis. Und Es müssen natürlich die korrekten jar Files der Plattform vorliegen. Also wenn man das für Windows bauen möchte, dann mit classifier: win die dependencies angeben ...
Das gradle.build mit jlink sieht auch nicht groß komplexer aus. jlink plugin sowie der jlink part, der aber nur den Namen setzt ist dazu gekommen.

build.gradle mit jlink:
plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.9'
    id 'org.beryx.jlink' version '2.22.0'
}

javafx {
    version = "11"
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

group 'de.kneitzel'
version '1.0-SNAPSHOT'
tasks.withType(JavaCompile) { options.encoding = 'UTF-8' }
modularity.disableEffectiveArgumentsAdjustment()
sourceCompatibility = 1.11

repositories {
    mavenCentral()
}

jlink {
    launcher {
        name = 'helloworld'
    }
}

mainClassName = 'HelloWorld.main/helloworld.HelloWorld'

dependencies {
    compile group: 'org.openjfx', name: 'javafx-controls', version: '11.0.2'
    compile group: 'org.openjfx', name: 'javafx-fxml', version: '11.0.2'
}

Die beiden Wege werden auch mittels Maven gehen. Generell ist meine Empfehlung aber, dass man mit Maven oder Gradle arbeitet, denn damit wird generell vermieden, dass JavaFX irgendwie (manuell) installiert werden muss. Und es müssen keine module-path angegeben werden auf Kommandozeile oder in der IDE.

Das wären erst einmal die Wege, die mir so vorschweben. Ab JDK 14 gibt es noch ein JPackage, aber damit habe ich mich noch nicht im Detail beschäftigt, da ich auf LTS Versionen setze und mein Neugier kontrollieren kann :) Aber damit liesse sich dann ein Installer für das image erstellen... Dazu sollte ein gradlew jpackage Aufruf schon ausreichen wenn ich die Dokumentation des Plugins richtig verstanden habe.

Ich hoffe, diese Lösungsideen kommen Deinen Anforderungen auch relativ nahe.
 
N

nieselfriem

Bekanntes Mitglied
Alles klar, ich werde es mir mal anschauen. Vielen Dank für deine Mühe. Ich war zwar Nachts auch wach aber bei mir war es eine Rufbereitschaft und keine javaprobem ;)

VG Georg
 
dzim

dzim

Top Contributor
Die für das Zielsystem einfachste (aber nicht unbedingt für dich) Variante ist, über GraalVM ein native executable zu bauen.
Du brauchst neben dem openjfx-Plugins, die @kneitzel schon erwähnt hat, noch das client-maven-plugin (siehe hier: https://github.com/gluonhq/client-maven-plugin) - und du musst von Gradle auf Maven wechseln.

Dann brauchst du lokal, neben deinem regulären JDK, noch ein aktuelles GraalVM (siehe hier: https://www.graalvm.org/downloads/).

Für Windows musst du noch Visual Studio installieren (was genau du an Paketen brauchst, weiss ich jetzt nicht, aber nimm an, dass es viele sind...). Alle Requirements findest du auf GitHub in meinem ersten Link. Etwas spezieller sind builds für RasperryPi, da hab ich keine Ahnung, wie das geht.

Aber nochmal etwas zurück: Der Weg über GraalVM ist im Ergebnis cool, aber der Weg ist sehr steinig. Ich habe auf Arbeit mir einen Seed gemacht, damit ich leicht ein Project zum Starten habe.
Du kannst, auch ohne JLink und der ganzen aktuellen Modul-Magic von Java, aber auch einfach ein Fat-Jar machen, dass JavaFX enthält. Das ist kein Problem und mit Maven z.B. mit dem Shade-Plugin einfach zu erreichen. Dann muss auf dem Zielsystem nur noch das richtige Java (ohne JavaFX!) installiert sein und gut ist.
 
N

nieselfriem

Bekanntes Mitglied
Der Tipp von Bellsoft klappt hervorragend unter Linux als auch unter Mac. Danke für den Tipp.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L JavaFX in Java Applikation einbinden AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
R Können Animationen in JavaFX "verschluckt" werden? AWT, Swing, JavaFX & SWT 8
dtr84 JavaFX/OpenJFX mittels Apache Ivy einbinden (Java 11) AWT, Swing, JavaFX & SWT 18
D runnable Jar mit Javafx erstellen(Eclipse) AWT, Swing, JavaFX & SWT 10
Monokuma Blöcke erzeugen (JavaFX) AWT, Swing, JavaFX & SWT 1
P JavaFx - Progressbar - Füllen mittels mehreren Tasks AWT, Swing, JavaFX & SWT 0
Rafael.Cupari JavaFx Installer AWT, Swing, JavaFX & SWT 16
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 3
C JavaFx sound abspielen AWT, Swing, JavaFX & SWT 3
C JavaFX mit CSS in Eclipse AWT, Swing, JavaFX & SWT 2
parrot JavaFX Fehler AWT, Swing, JavaFX & SWT 4
B JavaFX JavaFX Anwendung deployen (entw als runnableJAR oder exe-Datei) AWT, Swing, JavaFX & SWT 15
W JavaFX JavaFX - TreeView will nicht AWT, Swing, JavaFX & SWT 8
H JavaFX JavaFX - Scene Builder - BorderPane AWT, Swing, JavaFX & SWT 23
D Columns unabhängig voneinander mit Daten füllen JavaFx AWT, Swing, JavaFX & SWT 1
C JavaFX Installation unter IntelliJ IDEA AWT, Swing, JavaFX & SWT 5
J JavaFX Label aktualisieren AWT, Swing, JavaFX & SWT 18
H JavaFX JavaFX Import Fehler AWT, Swing, JavaFX & SWT 4
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
T Szene wechselen JavaFX mit If in Main Class AWT, Swing, JavaFX & SWT 2
S JavaFx Zufallsfarbe beim Button-Klick AWT, Swing, JavaFX & SWT 22
M JavaFX JavaFX in mehrere Controller AWT, Swing, JavaFX & SWT 21
R javafx erste application AWT, Swing, JavaFX & SWT 12
kneitzel JavaFX - Binding & Co AWT, Swing, JavaFX & SWT 42
S Alternative JavaFX TableView AWT, Swing, JavaFX & SWT 1
B Game of Life in JavaFX AWT, Swing, JavaFX & SWT 5
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
N JavaFX Chioceboxen verküpfen AWT, Swing, JavaFX & SWT 0
J JavaFX Controls AWT, Swing, JavaFX & SWT 4
S JavaFx AWT, Swing, JavaFX & SWT 2
Tashtego JavaFX + Mobile AWT, Swing, JavaFX & SWT 9
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
L JavaFX Javafx Dependency-Inversion AWT, Swing, JavaFX & SWT 19
OSchriever JavaFX JavaFX auf Raspberry Pi 4 AWT, Swing, JavaFX & SWT 6
M JavaFX Tab auswählen mit JavaFX AWT, Swing, JavaFX & SWT 9
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
M Java und JavaFX 13 läuft endlich AWT, Swing, JavaFX & SWT 4
N JavaFX Logging des JavaFX Application Threads mit Log4J AWT, Swing, JavaFX & SWT 3
L Java FX JavaFX Effect Attribute ausdrucken AWT, Swing, JavaFX & SWT 1
Hatsi09 JavaFx Mediaplayer seltsames Verhalten AWT, Swing, JavaFX & SWT 0
Tashtego JavaFX - Datenübergabe zwischen Scenes AWT, Swing, JavaFX & SWT 8
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
S Jogl und JavaFX AWT, Swing, JavaFX & SWT 6
Bluedaishi JavaFX ProgressBar AWT, Swing, JavaFX & SWT 10
S JavaFX JavaFX TableView scrollen färbt falsche Zeilen AWT, Swing, JavaFX & SWT 1
F JavaFX JavaFX Builden: JavaFX Runtime components are missing AWT, Swing, JavaFX & SWT 0
F JavaFX wirft zufällig Exceptions AWT, Swing, JavaFX & SWT 5
M JavaFX JAVAFX TreeItem mit Tooltip versehen AWT, Swing, JavaFX & SWT 4
techM JavaFX -> CSS AWT, Swing, JavaFX & SWT 5
J JavaFx TableView mit CheckBox AWT, Swing, JavaFX & SWT 4
J JavaFX Stoppuhr mit javafx.timeline AWT, Swing, JavaFX & SWT 2
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
L JavaFX auf dem PI 4 installieren AWT, Swing, JavaFX & SWT 2
L JavaFX JavaFX Forms mit Groovy starten AWT, Swing, JavaFX & SWT 1
K JavaFX CSS Border (Verschiebung verhindern) AWT, Swing, JavaFX & SWT 4
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
M error: package javafx.scene.web is not visible import javafx.scene.web.*; AWT, Swing, JavaFX & SWT 16
J import javafx.fxml* bei JavaFX 13 geht nicht mehr AWT, Swing, JavaFX & SWT 7
F Kein JavaFX mehr im Eclipse Wizard AWT, Swing, JavaFX & SWT 1
N Ausführbare Datei aus JavaFX Projekt erstellen AWT, Swing, JavaFX & SWT 22
N Array mit JavaFX Elementen AWT, Swing, JavaFX & SWT 9
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
W JavaFX JavaFX - Spalten auf ganze SpreadsheetView verteilen AWT, Swing, JavaFX & SWT 16
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
S Erwaege JavaFX Einstieg AWT, Swing, JavaFX & SWT 27
O JavaFX mini Taschenrechner! AWT, Swing, JavaFX & SWT 35
L JavaFX JavaFX, FXML und Guice? AWT, Swing, JavaFX & SWT 0
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
L Javafx Controller Klasse in Maven AWT, Swing, JavaFX & SWT 7
L JavaFX JavaFX stürtzt durch einen Server#connect Exception AWT, Swing, JavaFX & SWT 3
Shallty JavaFX MenuItem (Info) Icon ändern AWT, Swing, JavaFX & SWT 7
E Aktuelle Uhrzeit auf jeder Stage anzeigen lassen (JavaFX) AWT, Swing, JavaFX & SWT 2
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
L Java FX Problem mit Ubuntu 18 und JavaFx AWT, Swing, JavaFX & SWT 27
L JavaFX JavaScript im Javafx Webview AWT, Swing, JavaFX & SWT 4
pkm Ich kann JavaFX nicht installieren AWT, Swing, JavaFX & SWT 4
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
L JavaFX JavaFX Diagram Editor AWT, Swing, JavaFX & SWT 3
L JavaFX JavaFX Application mit Preloader sauber runterfahren AWT, Swing, JavaFX & SWT 10
K JavaFX funktioniert nicht AWT, Swing, JavaFX & SWT 2
G JavaFX Slider in JavaFX beide Seiten beschriften AWT, Swing, JavaFX & SWT 2
D JavaFX JavaFX Tutorial AWT, Swing, JavaFX & SWT 8
Bluedaishi JavaFX JFoenix TextField KeyEvent AWT, Swing, JavaFX & SWT 2
B JavaFx TreeView mit file system AWT, Swing, JavaFX & SWT 1
Bluedaishi JavaFX Button Image aus Datenbank AWT, Swing, JavaFX & SWT 13
B JavaFx Scene Builder Problem AWT, Swing, JavaFX & SWT 2
H Feste Positionen und Größen in JavaFX AWT, Swing, JavaFX & SWT 1
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
B JavaFX JavaFX Table gespeichertes Wert auswählen/anvisieren AWT, Swing, JavaFX & SWT 3
FRI3ND JavaFX: Wie kann ich einer Scene Argumente übergeben? AWT, Swing, JavaFX & SWT 14
J Javafx mediaplayer mit sftp AWT, Swing, JavaFX & SWT 0
platofan23 JAVAFX zweites Fenster öffnen AWT, Swing, JavaFX & SWT 2
MoxxiManagarm JavaFX Auch ich versuche mit JavaFX warm zu werden AWT, Swing, JavaFX & SWT 9
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
J JavaFX Wie verhindere ich das gleichzeitige Spielen von Dateien bei Mediaplayer JavaFX? AWT, Swing, JavaFX & SWT 3
H JavaFX - Label aktualisieren AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Anzeige

Neue Themen


Oben