JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge

tommybalbor

Mitglied
Das ist meine aktuelle POM:
Java:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>...</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit.version>5.9.1</junit.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.jdom</groupId>
      <artifactId>jdom2</artifactId>
      <version>2.0.5</version>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>19.0.2</version>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-fxml</artifactId>
      <version>19.0.2</version>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-graphics</artifactId>
      <version>19.0.2</version>
      <classifier>win</classifier>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-graphics</artifactId>
      <version>19.0.2</version>
      <classifier>linux</classifier>
    </dependency>

    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>19.0.2</version>
      <classifier>mac</classifier>
    </dependency>

    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-fxml</artifactId>
      <version>19.0.2</version>
      <classifier>mac</classifier>
    </dependency>

    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-graphics</artifactId>
      <version>19.0.2</version>
      <classifier>mac-aarch64</classifier>
    </dependency>

    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-fxml</artifactId>
      <version>19.0.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
    <dependency>
      <groupId>org.xerial</groupId>
      <artifactId>sqlite-jdbc</artifactId>
      <version>3.41.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.jfoenix/jfoenix -->
    <dependency>
      <groupId>com.jfoenix</groupId>
      <artifactId>jfoenix</artifactId>
      <version>9.0.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-media -->
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-media</artifactId>
      <version>19.0.2</version>
    </dependency>
    <dependency>
      <groupId>org.xerial</groupId>
      <artifactId>sqlite-jdbc</artifactId>
      <version>3.41.0.0</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
    </plugins>
  </build>
</project>


Wenn ich meien JavaFx Anwendung starte, funktioniert sie problemlos für Windows und Linux Nutzer, aber bei Macs, habs bei 3 Stück getestet, die Anwendung starte kommt diese Fehlermeldung:

Code:
Graphics Device initialization failed for :  es2, sw
Error initializing QuantumRenderer: no suitable pipeline found
java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
    at javafx.graphics@19.0.2/com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:283)
    at javafx.graphics@19.0.2/com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:253)
    at javafx.graphics@19.0.2/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:268)
    at javafx.graphics@19.0.2/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291)
    at javafx.graphics@19.0.2/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:163)
    at javafx.graphics@19.0.2/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:659)
    at javafx.graphics@19.0.2/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:410)
    at javafx.graphics@19.0.2/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1081)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
    at javafx.graphics@19.0.2/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:95)
    at javafx.graphics@19.0.2/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
    at java.base/java.lang.Thread.run(Thread.java:1589)
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1081)
Caused by: java.lang.RuntimeException: No toolkit found
    at javafx.graphics@19.0.2/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:280)
    at javafx.graphics@19.0.2/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291)
    at javafx.graphics@19.0.2/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:163)
    at javafx.graphics@19.0.2/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:659)
    at javafx.graphics@19.0.2/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:410)
    at javafx.graphics@19.0.2/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    ... 2 more

Die Macs die ich getestet habe, hatten alle einen m-Chip.

Wenn ich nun nur diese beiden Dependencies lösche:
Code:
 <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-graphics</artifactId>
      <version>19.0.2</version>
      <classifier>win</classifier>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-graphics</artifactId>
      <version>19.0.2</version>
      <classifier>linux</classifier>
    </dependency>


So dass meine Pom so aussieht:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>...</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit.version>5.9.1</junit.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.jdom</groupId>
      <artifactId>jdom2</artifactId>
      <version>2.0.5</version>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>19.0.2</version>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-fxml</artifactId>
      <version>19.0.2</version>
    </dependency>

    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>19.0.2</version>
      <classifier>mac</classifier>
    </dependency>

    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-fxml</artifactId>
      <version>19.0.2</version>
      <classifier>mac</classifier>
    </dependency>

    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-graphics</artifactId>
      <version>19.0.2</version>
      <classifier>mac-aarch64</classifier>
    </dependency>

    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-fxml</artifactId>
      <version>19.0.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
    <dependency>
      <groupId>org.xerial</groupId>
      <artifactId>sqlite-jdbc</artifactId>
      <version>3.41.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.jfoenix/jfoenix -->
    <dependency>
      <groupId>com.jfoenix</groupId>
      <artifactId>jfoenix</artifactId>
      <version>9.0.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-media -->
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-media</artifactId>
      <version>19.0.2</version>
    </dependency>
    <dependency>
      <groupId>org.xerial</groupId>
      <artifactId>sqlite-jdbc</artifactId>
      <version>3.41.0.0</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
    </plugins>
  </build>
</project>

Also 1 zu 1 gleich, nur ohne die beiden Dependencies, dann geht es bei Mac-Usern ohne Probleme,ABER nun erhalten Windows und Linux Nutzer beim Starten der Applikation die Fehlermeldung, die zuvor die Mac User erhalten haben, also genau die gleiche, wie oben rangehangen.


Was kann ich tun?
 
Was trägst Du denn die spezifischen Plattformen ein? Das sollte nicht notwendig sein. Aber Du musst dann die jeweiligen Versionen auf der entsprechenden Plattform bauen.

Im Augenblick vermute ich, dass Du macOS etwas baust. Ohne die spezifischen Versionen hast Du dann die Mac Variante automatisch. Sobald Du aber (mindestens) eine spezifische Variante einträgst, dann kommt nur noch die spezifische Variante rein.

Du kannst also die Mac Varianten hinzu nehmen. Das wären dann mac und mac-aarch64.

Aber wie gesagt: JavaFX nutzt Du, daher würde ich die Abhängigkeiten weglassen und dann auf den einzelnen Plattformen ein Image bauen mittels JPackage. Dazu müsste das dann aber halt auf Linux, Windows und auf dem Mac gebaut werden.
 
Was trägst Du denn die spezifischen Plattformen ein? Das sollte nicht notwendig sein. Aber Du musst dann die jeweiligen Versionen auf der entsprechenden Plattform bauen.

Im Augenblick vermute ich, dass Du macOS etwas baust. Ohne die spezifischen Versionen hast Du dann die Mac Variante automatisch. Sobald Du aber (mindestens) eine spezifische Variante einträgst, dann kommt nur noch die spezifische Variante rein.

Du kannst also die Mac Varianten hinzu nehmen. Das wären dann mac und mac-aarch64.

Aber wie gesagt: JavaFX nutzt Du, daher würde ich die Abhängigkeiten weglassen und dann auf den einzelnen Plattformen ein Image bauen mittels JPackage. Dazu müsste das dann aber halt auf Linux, Windows und auf dem Mac gebaut werden.
Ja da hast du recht, aber ich musste die spezifische Variante hinzufügen, damit, wenn ich z. B. eine Jar datei von einem Windowsgerät erstelle, ich auch diese Jar-Datei bei Linux und Mac nutzen kann.
Sonst war es immer so, dass die erstellte Jar-Datei nur beim gleichen Betriebssystem funktioniert hat.


Und anderseits habe ich das Problem, dass ich kein Image erstellen darf, ich muss bzw. es wird gefordert, dass wir eine Jar Datei erstellen.

Und sind in der POM nicht shcon mac und mac-aarch64?
 
Und anderseits habe ich das Problem, dass ich kein Image erstellen darf, ich muss bzw. es wird gefordert, dass wir eine Jar Datei erstellen.
Das ist schlecht. Wie sieht die Anforderung genau aus? Kann man als Anforderung stellen, dass ein JDK / JRE installiert ist, das JavaFX bereits enthält? Dann könnte man da entsprechende OpenJDK Varianten installieren (z.B. Liberica: Download Java | Java 8, Java 11, Java 17, Java 20 - OpenJDK Builds for Linux, Windows & macOS (bell-sw.com)
Wenn das als Anforderung gestellt werden könnte, dann könnte man die jar ohne JavaFX erstellen.

Oder ist evtl. noch Java 8 als Zielplattform denkbar? Oracle hatte in Java 8 noch das JavaFX mit drin. Dann könntest Du ggf. auch die Abhängigkeiten weg lassen. Das würde ggf. auch dazu passen, dass noch jar Dateien verwendet werden. (Das ist mit Java 9 / JLink und allerspätestens Java 14 / JPackage eigentlich unüblich.)


Und sind in der POM nicht shcon mac und mac-aarch64?
Nicht von der javafx-graphics. Du hast sogar das große Glück, dass es hier keine Plattformabhängigkeiten gibt (oder Du nichts verwendest, das in javafx-controls / javafx-fxml spezifisch für die einzelnen Plattformen ist).

Soweit ich weiss, sind die Libraries alle in javafx-graphics. Da musst Du also sicher stellen, dass Du alle Plattformen bereit stellst.

Und ich habe keine Ahnung, ob man mac und mac-aarch64 gleichzeitig rein packen kann.

Also generell ist das alles recht schlecht. Es ist halt üblich, dass man als Anwendung auf Windows eine EXE und auf dem Mac ein app Verzeichnis mit der Applikation bereit stellt (Linux ist etwas komplexer, da wäre es dann ein Binary). Und die kann man halt sehr schön bauen lassen z.B. in einer CI/CD Pipeline. Und man spart sich die ganzen Probleme mit der installierten Java Version (Das ist ein Horror - wenn man mehrere Java Anwendungen hat, die da ggf. gegensätzliche Anforderungen haben ... da ist dann nichts mit "Doppelklick auf jar Datei". Da habe ich leider auch schon beruflich negative Erfahrungen sammeln dürfen - und war dann froh, als MDOP mit App-V gekommen ist!)

Darf man fragen, woher die Anforderungen kommen? Ist das in einer Ausbildung oder in einem beruflichen Umfeld?
 
Das ist schlecht. Wie sieht die Anforderung genau aus? Kann man als Anforderung stellen, dass ein JDK / JRE installiert ist, das JavaFX bereits enthält? Dann könnte man da entsprechende OpenJDK Varianten installieren (z.B. Liberica: Download Java | Java 8, Java 11, Java 17, Java 20 - OpenJDK Builds for Linux, Windows & macOS (bell-sw.com)
Wenn das als Anforderung gestellt werden könnte, dann könnte man die jar ohne JavaFX erstellen.

Oder ist evtl. noch Java 8 als Zielplattform denkbar? Oracle hatte in Java 8 noch das JavaFX mit drin. Dann könntest Du ggf. auch die Abhängigkeiten weg lassen. Das würde ggf. auch dazu passen, dass noch jar Dateien verwendet werden. (Das ist mit Java 9 / JLink und allerspätestens Java 14 / JPackage eigentlich unüblich.)



Nicht von der javafx-graphics. Du hast sogar das große Glück, dass es hier keine Plattformabhängigkeiten gibt (oder Du nichts verwendest, das in javafx-controls / javafx-fxml spezifisch für die einzelnen Plattformen ist).

Soweit ich weiss, sind die Libraries alle in javafx-graphics. Da musst Du also sicher stellen, dass Du alle Plattformen bereit stellst.

Und ich habe keine Ahnung, ob man mac und mac-aarch64 gleichzeitig rein packen kann.

Also generell ist das alles recht schlecht. Es ist halt üblich, dass man als Anwendung auf Windows eine EXE und auf dem Mac ein app Verzeichnis mit der Applikation bereit stellt (Linux ist etwas komplexer, da wäre es dann ein Binary). Und die kann man halt sehr schön bauen lassen z.B. in einer CI/CD Pipeline. Und man spart sich die ganzen Probleme mit der installierten Java Version (Das ist ein Horror - wenn man mehrere Java Anwendungen hat, die da ggf. gegensätzliche Anforderungen haben ... da ist dann nichts mit "Doppelklick auf jar Datei". Da habe ich leider auch schon beruflich negative Erfahrungen sammeln dürfen - und war dann froh, als MDOP mit App-V gekommen ist!)

Darf man fragen, woher die Anforderungen kommen? Ist das in einer Ausbildung oder in einem beruflichen Umfeld?
Danke, zunächst ist für ein Uniprojekt, wo die Jars verlangen.

Wir dürfen selebr aussuchen, welche java-Version eine Mindestvoraussetzung für unsere Applikation ist.

Das mit " Wenn das als Anforderung gestellt werden könnte, dann könnte man die jar ohne JavaFX erstellen.", habe ich nicht ganz verstanden.
Also bei uns ist es so, dass jeder mindestens Java 11 hat, die meisten haben java 19.

Wenn ich nun dieses liberica nutze und damit dann später auch eine jar in intelij erstelle, können dass dann auch andere Personen die kein liberica haben nutzen, also die jar?
Wenn ja, kann man liberica mit maven in das intelij projekt ienfügen?


(Bezüglich jar ohne javafx erstellen, also bei uns war es z. B. so, dass die mac und linus user alle java 18 bis 19 hatten und ohne diese dependencies nicht die Jar ausführen konnten, die jemand, mit einem anderen Betriebssystem, erstellt hat.)
 
Wir dürfen selebr aussuchen, welche java-Version eine Mindestvoraussetzung für unsere Applikation ist.
Dann ist es evtl. eine Idee, auf Oracle Java 8 zu setzen. Da hast Du dann ein integriertes JavaFX. Aber Du musst die Lizenzbedingungen prüfen - Oracle hat da ggf. etwas angepasst.

Das mit " Wenn das als Anforderung gestellt werden könnte, dann könnte man die jar ohne JavaFX erstellen.", habe ich nicht ganz verstanden.
Also bei uns ist es so, dass jeder mindestens Java 11 hat, die meisten haben java 19.
Es gibt Java Installationen, die JavaFX mit beinhalten. Dann musst Du das nicht mehr als Abhängigkeit mitgeben.

(Bezüglich jar ohne javafx erstellen, also bei uns war es z. B. so, dass die mac und linus user alle java 18 bis 19 hatten und ohne diese dependencies nicht die Jar ausführen konnten, die jemand, mit einem anderen Betriebssystem, erstellt hat.)
Ja, denn JavaFX hat unterschiedliche jar Files für diverse Betriebsssteme.

Du kannst mal ausprobieren, dass Du:
a) Aus dem POM, das Du oben gezeigt hast, die <classifier>mac</classifier> heraus nimmst.
b) Du dann diese Abhängigkeiten hinzu fügst:

XML:
     <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-graphics</artifactId>
      <version>19.0.2</version>
      <classifier>win</classifier>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-graphics</artifactId>
      <version>19.0.2</version>
      <classifier>linux</classifier>
    </dependency>
 <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-graphics</artifactId>
      <version>19.0.2</version>
      <classifier>mac</classifier>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-graphics</artifactId>
      <version>19.0.2</version>
      <classifier>mac-aarch64</classifier>
    </dependency>

Damit hast Du Abhängigkeiten für windows, linux und Mac (x86 / aarch64) hinzugefügt.
Evtl. klappt das. Sollte es Probleme geben, dann ggf. die Dependencie mit mac-aarch64 heraus nehmen.

Aber das setzt voraus, dass es bei den anderen javafx Abhängigkeiten keine Plattform-Differenzen gibt. Das muss aber nicht zwingend so sein.

Du hast uns nicht gezeigt, wie Du die jar Datei genau baust. Daher kann ich nicht sagen, ob das eine Chance hat. Aber ein Versuch ist es ggf. wert.
 

Zurück
Oben