【问题标题】:Bundling JavaFX Library with Maven in executable JAR (for Java 11+)在可执行 JAR 中将 JavaFX 库与 Maven 捆绑在一起(适用于 Java 11+)
【发布时间】:2019-11-21 11:37:54
【问题描述】:

我正在使用 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>

我的目标是通过在可执行文件JAR 中包含JavaFX 来指示maven 构建一个JAR,它可以在任何大于或等于8 的Java 版本上运行。

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

【问题讨论】:

  • 您从问题中链接的 zenjava javafx maven 插件已过时,您应该使用 org.openjfx 插件,如 [run HelloWorld via Maven] 帖子中所示,您不需要创建使用程序集插件程序集。
  • 您的目标是拥有一个 jar 到“我的目标是通过在可执行 JAR 中包含 JavaFX,指示 maven 构建一个可以在任何大于或等于 8 的 Java 版本上运行的 JAR。”可能证明很困难,JavaFX 通常是支持它的 Java 8 发行版的 JRE 的一部分,它仅被设计为以后版本(例如 11+)中的单独库。
  • 您可能希望create a runtime image(包括 JRE)而不是尝试创建可以与预安装的 JRE 一起使用的可执行 JAR。
  • 糟糕,在之前的评论中错过了指向 HelloWorld via Maven 的链接。
  • 另一种选择是jpackage,如果可用的话。

标签: java maven javafx java-11


【解决方案1】:

我像这样使用 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 除了调用你的主类之外什么都不做。

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 2011-10-12
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多