JavaFX, Jar über Maven kreieren

Tintenfisch

Bekanntes Mitglied
Hallo allerseits,
ich versuche derzeit eine ausführbare Jar eines Fx Projektes mit Maven zu erstellen. Allerdings scheitert dies an dem scheinbar weit verbreitetem "Problem" mit den Laufzeitkomponenten. Ich hatte gelesen, dass dies über die module-info behoben werden kann, jedoch zeigt dies bei mir keinerlei Erfolg. Wenn ich den Befehl "mvn javafx:run" ausführe, funktioniert dies soweit. Auch die jars werden fehlerfrei erzeugt, sowohl eine mit- und eine ohne Abhängigkeiten. Beim Versuch die jar allerdings auszuführen wird die Fehlermeldung "JavaFX runtime components are missing, and are required to run this application" gezeigt.
Anbei mal der Code aus der pom.fml und der module-info.java Datei. Über Tipps wäre ich sehr dankbar.

Java:
module fxmaven {
       requires javafx.fxml;
       requires javafx.controls;
       requires javafx.graphics;
        exports application;
}

XML:
<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>com</groupId>
  <artifactId>fxmaven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>fxmaven</name>
  <description>des</description>
 
   <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>   
    <maven.compiler.source>15</maven.compiler.source>
    <maven.compiler.target>15</maven.compiler.target>
  </properties>
 
  <!-- DEPENDENCIES -->
  <dependencies>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>15</version>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-fxml</artifactId>
      <version>15</version>
    </dependency>
  </dependencies>

  <build>
    <sourceDirectory>src</sourceDirectory>
    <resources>
      <resource>
        <directory>src</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>
    
    <plugins>
    <!-- COMPILE -->
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <release>15</release>
        </configuration>
      </plugin>
      
       <plugin>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>0.0.5</version>
        <configuration>
          <release>11</release>
          <jlinkImageName>hellofx</jlinkImageName>
          <launcher>fxmaven</launcher>
          <mainClass>fxmaven/application.Main</mainClass>
        </configuration>
      </plugin>
      
          <!-- ASSEMBLY JAR -->
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>application.Main</mainClass>
                        </manifest>
                    </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>   
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
    </plugins>
  </build>
</project>
 
Also erste Aussage: JavaFX ist teilweise etwas - sagen wir mal - seltsam.

So ist JavaFX bezüglich Classloader teilweise anspruchsvoll - ohne da näher drauf eingehen zu wollen.

a) Bei dem benutzten Plugin ist die Idee, dass man kein JAR erzeugt zum starten. Statt dessen solltest Du ein Image erstellen lassen mit mvn javafx:jlink
Dann bekommst Du ein Image, das Du ausführen kannst (Dafür hast Du in der pom ja auch den launcher und so angegeben!)

b) Workaround - aber das ist so nicht vorgesehen: Mach eine neue Klasse mit einer main Methode. Also etwas wie:

Java:
public class Start {
    public static void main(String[] args) {
        application.Main.main(args);
    }
}

(Deine Main erbt vermutlich von Application und ruft dann launch auf. Und genau das macht etwas Probleme: Die Startklasse erbt schon von einer JavaFX Klasse. Das ist dann nicht mehr der Fall und das könnte das Problem beheben.)

Aber noch einmal: Das ist so nicht vorgesehen und das würde ich so NICHT machen. Nutze den jlink Weg. Und wenn Du kein Script zum starten haben willst, dann nutz noch jpackage (ab Java 14) um ein AppImage zu erstellen, dass dann eine exe bereit stellt (unter Windows).
 

Neue Themen


Zurück
Oben