java - 在可执行 JAR 中将 JavaFX 库与 Maven 捆绑在一起(适用于 Java 11+)

标签 java maven javafx java-11

我正在使用 Java 8JavaFX .当我打包我的可执行文件时 JARmaven , 可执行文件 JAR使用 Java 8 工作正常.但是,如果我运行 JAR与例如Java 13 ,我收到以下错误:

Error: Could not find or load main class ApplicationLauncherClient
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application

这大概是由 JavaFX 引起的未与 JRE 捆绑在一起/JDK自从 Java 11 .

我的 pom.xml构建配置如下所示:
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>ApplicationLauncherClient</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我的目标是指导maven建一个JAR可以在任何 Java 上运行版本大于或等于 8,包括 JavaFX在可执行文件中 JAR .

我没有按照 this 中的说明成功回答(例如,将 JavaFX 插件添加到我的 pom.xml 中)。 Including OpenJFX as dependency也没有工作,我仍然收到同样的错误。

最佳答案

我像这样使用 javafx-maven-plugin 和 maven-shade-plugin:

    <build>
        <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
          <configuration>
            <release>11</release>
            <target>8</target>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.openjfx</groupId>
          <artifactId>javafx-maven-plugin</artifactId>
          <version>0.0.3</version>
          <configuration>
            <mainClass>Your_main_class</mainClass>
          </configuration>
      </plugin>
                <plugin>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>3.2.1</version>
                    <executions>
                    <execution>
                        <phase>package</phase>
                    <goals>
                    <goal>shade</goal>
                    </goals>
                    <configuration>
                    <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                      <mainClass>Your_main_class_starter</mainClass>
                    </transformer>
                    </transformers>
                    </configuration>
                    </execution>
                    </executions>
                </plugin>              
    </plugins>
</build>

Your_main_class 是这样的:
public class App extends Application {

private static Scene scene;

@Override
public void start(Stage stage) throws IOException {
    Parent mainForm = FXMLLoader.load(getClass().getResource("mainForm.fxml"));
    scene = new Scene(mainForm , 425, 275);
    stage.setScene(scene);
    stage.show();
}

public static void main(String[] args) {
    launch();
}
}

而 Your_main_class_starter 看起来像这样:
public class LaunchApp {
public static void main(String[] args) {
    App.main(args);
}

所以 Your_main_class_starter 除了调用你的主类之外什么都不做。

关于java - 在可执行 JAR 中将 JavaFX 库与 Maven 捆绑在一起(适用于 Java 11+),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58974100/

相关文章:

java - 如何在 Ubuntu 20.04 上安装 JavaFX

梅文 : mvn --version Error: JAVA_HOME is not defined correctly

maven - 如何避免在 maven-site-plugin 中检查父项目?

java - 从 JavaFX 打印时设置要使用的 CSS

java - 如何在包中运行 Java 类?

java - src/main/resources 中的 Maven Jar 主类

JavaFX - 在高 dpi 的 Canvas 上使用矩形绘制时避免模糊

Java-比较 itr() 和 itr.next() 的 double 值

java - 如何将字符串文本添加到 orElse 和 .map

java - 类之间的Android消息