Verpackungsproblem bei JavaFX-Maven-Projekten mit mehreren Modulen

Lesezeit: 7 Minuten

Dies ist ein Versuch, eine JavaFX-Anwendung mit mehreren Modulen mit Maven zu erstellen.

Bei folgender Projektstruktur:

project
|  pom1.xml
|_____ Word Generator (Folder)
      |  pom2.xml
      |_____logic (folder)
            |  WordGenerator
|_____UI (folder)
      |  pom3.xml
      |_____marty  
            |  App
            |  PrimaryController
            |  SecondaryController

Wir haben die folgende Struktur der pom-Dateien in der Reihenfolge des obigen Schemas:

pom1.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.games.marty</groupId>
    <artifactId>words</artifactId>
    <packaging>pom</packaging>
    <version>0.1</version>

    <modules>
        <module>UI</module>
        <module>Word Generator</module>
    </modules>

    <properties>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration>
                        <source>16</source>
                        <target>16</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

pom2.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>words</artifactId>
        <groupId>org.games.marty</groupId>
        <version>0.1</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>word.generator</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration>
                        <source>16</source>
                        <target>16</target>
                    </configuration>
                </plugin>
                <plugin>
                    <!-- Build an executable JAR -->
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>3.1.0</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <addClasspath>true</addClasspath>
                                <classpathPrefix>lib/</classpathPrefix>
                                <mainClass>org.games.marty.logic.WordGenerator</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

pom3.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 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>UI</artifactId>
    <version>0.1</version>

    <parent>
        <artifactId>words</artifactId>
        <groupId>org.games.marty</groupId>
        <version>0.1</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>16</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>16</version>
        </dependency>
        <dependency>
            <groupId>org.games.marty</groupId>
            <artifactId>word.generator</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>16</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.6</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running -->
                        <!-- Usage: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>org.games.marty.App</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <!-- Build an executable JAR -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>org.games.marty.App</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Die Art und Weise, wie wir versucht haben, die Anwendung zu erstellen, damit die Benutzeroberfläche Zugriff auf die WordGenerator-Logik hat, ist maven package das Ergebnis der Direktive pom1.xml

Wir erhalten den oben genannten Fehler, wie bereits erwähnt:

Error: Could not find or load main class org.games.marty.App
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application

Soweit ich weiß, werden die JavaFX-Abhängigkeiten über Maven installiert und sollten verfügbar sein, aber sie fehlen?

Verpackungsproblem bei JavaFX Maven Projekten mit mehreren Modulen
Juwelsee

Verpackung über mvn package Verwendung der maven-jar-plugin ist nicht genug

mvn packagewird standardmäßig nur das JAR für Ihren Anwendungscode packen, es wird nicht den gesamten abhängigen Bibliothekscode enthalten (weshalb der abhängige Code nicht gefunden werden kann, wenn Sie versuchen, Ihre Anwendung auszuführen).

Sie könnten Ihren Anwendungscode und abhängige Bibliotheken mithilfe einer Assembly packen, wie in Wie kann ich mit Maven eine ausführbare JAR-Datei mit Abhängigkeiten erstellen? beschrieben, obwohl dieser Ansatz nicht der einzige ist, um Ihr Problem zu lösen.

Sie müssen eine Art Runtime-Image erstellen

Es gibt zahlreiche Optionen zum Erstellen von Runtime-Images, und ich kenne Ihre Anforderungen nicht, daher kann ich Ihnen nicht empfehlen, was Sie stattdessen tun sollten. Beispieloptionen sind:

  1. Ein Zip/Tar Ihrer Anwendung plus Bibliotheken in einem separaten Verzeichnis.
  2. Die Erstellung einer einzelnen JAR-Datei, die den gesamten abhängigen Code enthält.
  3. Entweder Lösung 1 oder 2, plus die Einbeziehung einer gepackten JRE.
  4. Ein Runtime-Image mit Ihrem Code und Ihren Bibliotheken, das auch nur die benutzerdefinierten Runtime-Teile der JRE- und JavaFX-Module verwendet, die Sie benötigen (unter Verwendung von jlink).
  5. Ein nativer Installer für entweder 3 oder 4 (unter Verwendung von jpackage + einem nativen Installer-Erstellungstool, z. B. WIX, RPM, DEB Installer Creators).

Die letzte Methode (natives Installationsprogramm) ist die Paketierungs-, Verteilungs- und Installationsmethode, die ich für die meisten nicht trivialen Anwendungen empfehlen würde.

Sie müssen recherchieren, wie das geht

Um zu Ihrer Lösung zu gelangen, müssen Sie Ihre eigenen Nachforschungen anstellen, und sobald Sie sich für einen Ansatz und ein Toolset entschieden haben, können Sie eine neue Frage zur Implementierung dieses Ansatzes erstellen, falls Sie weiterhin Schwierigkeiten haben.

Ähnliche Resourcen

Warnung für schattierte Gläser

Wenn Sie den gesamten JavaFX-Code mit dem Maven-Shade-Plug-in in einem einzigen JAR bündeln, erhalten Sie eine Warnung wie die folgende, wenn Sie Ihre Anwendung von Java 16+ ausführen:

WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @28c71909'

Dies weist darauf hin, dass eine solche Konfiguration nicht unterstützt wird und in zukünftigen und möglicherweise aktuellen Revisionen der JavaFX-Plattform brechen kann (und wahrscheinlich wird). Daher werden schattierte JAR-Dateien, die JavaFX-Plattformcode enthalten, von mir nicht empfohlen, obwohl solche JAR-Dateien derzeit möglicherweise für Ihre Bereitstellungen funktionieren.

JavaFX 11+ wurde entwickelt, um als Satz von Modulen verwendet zu werden. Konfigurationen werden nicht unterstützt, wenn sie die JavaFX-Plattform nicht außerhalb des Modulpfads ausführen, sondern stattdessen den Plattformcode außerhalb des Klassenpfads ausführen (wie es eine schattierte JAR-Datei tun würde).

994690cookie-checkVerpackungsproblem bei JavaFX-Maven-Projekten mit mehreren Modulen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy