JavaFX Maven Assembly 插件不断打包到错误的 JDK 版本

问题描述 投票:0回答:1

我在 IntelliJ 中创建了一个应用程序,它允许我在工作时阅读 epub,而不会在有人经过我的 mac 时被注意到(iBook 往往很引人注目)。它基本上只是一个未装饰的 JavaFX 窗口,带有一个标签,可以输入单个段落一次在epub中标记,通过方向键控制前进和后退。 该应用程序在我的电脑(JDK21)上编译和打包得很好,但是当我尝试为 1.8(工作中的 java 版本)构建它时,它一直抱怨该应用程序是在比 mac 上的版本更新的版本(55)中编译的(52)..

它清理、构建、打包没有错误..但是当我尝试使用命令行“java -jar readerfx.jar”时它会抛出错误..

我的猜测是 POM 文件依赖项中的某个版本正在覆盖编译器版本,但我不确定是什么..

这是我的 POM.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>
    <groupId>com.reader</groupId>
    <artifactId>readerfx</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>13</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>13</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.parsers</groupId>
            <artifactId>jaxp-api</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
            <version>1.0.b2</version>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.reader.Launcher</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                         <id>assemble-all</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

到目前为止我尝试过的:

  • 下载、解压并将我的 HOME 和路径变量设置为 1.8 版本的 JAVA (openlogic-openjdk-8u402-b06-windows-64)
  • 在我的 IntelliJ 设置中,在“项目”下,将“SDK”设置为 1.8
  • 在我的 IntelliJ 设置中,在“项目”下,将“语言级别”设置为 8
  • 在我的 IntelliJ 设置中,在模块下,将“Module SDK”设置为“Project SDK 1.8”
  • 创建了一个启动主应用程序的启动器应用程序
  • 在我的 POM.xml 文件中将 maven-compiler-plugin 配置中的“源”和“目标”变量更改为 1.8
  • 尝试删除“javafx-controls”和“javafx-fxml”的依赖关系,因为java 1.8的库中仍然有JavaFX,但后来它找不到类javaFX.Application.application,所以我把它们放回..
  • 在网上找到的某个地方我可以将“版本”和“目标”添加到 maven- assembly-plugin 的配置中,但是当我添加它们时,IntelliJ 说“此处不允许元素源”
java maven intellij-idea javafx java-8
1个回答
1
投票

您正尝试在不兼容的 JDK 上运行您的应用程序

正如 James_D 在评论中指出的,JavaFX 13 与 JDK 8 不兼容。

Gluon 提供了一个方便的表格,其中列出了支持每个主要 JavaFX 版本所需的最低 Java 运行时版本

总结:

  • JavaFX 11-19 -> JRE 11 所需的最小 JRE。
  • JavaFX 21-23 -> JRE 17 所需的最小 JRE。

JDK 8 在某些发行版(例如较旧的 Oracle 发行版)中包含 JavaFX,但在其他发行版(许多 JDK 8 OpenJDK 发行版)中则不包含 JavaFX。

因为你尝试过这个但不起作用:

尝试删除“javafx-controls”和“javafx-fxml”的依赖关系,因为java 1.8的库中仍然有JavaFX,但后来它找不到类javaFX.Application.application,所以我把它们放回..

这意味着您使用的 JDK 不包含 JavaFX。对于 Windows(据我所知),没有没有方法可以将 JavaFX 添加到 JDK 8 版本,而该版本从一开始就没有包含 JavaFX(这就是您的情况)。

推荐解决方案

我建议您使用

jlink
创建应用程序的运行时发行版。

这样您就不必依赖预装的 Java 版本。

有关执行此操作的说明位于 JavaFX 入门文档的“运行时图像”部分。您可以使用 openjfx javafx-maven-plugin

(而不是 
maven-assembly-plugin
)来构建 jlink 映像的 zip 发行版。然后您要做的就是在目标计算机上解压缩 
jlink
 映像,并通过 
jlink
 创建的包含的 shell 脚本运行它。

© www.soinside.com 2019 - 2024. All rights reserved.