我的JavaFX应用程序从源代码运行得非常完美,但是当我编译成单个jar文件时,出现以下错误:
错误:缺少JavaFX运行时组件,需要运行此应用程序。
我使用Maven作为我的存储库管理器,并且我的Maven安装成功。
注意:在我的IntelliJ构建工件中,我可以看到IntelliJ包括JavaFX及其所有库。
我的JavaFX应用程序从源代码运行得非常完美,但是当我编译成单个jar文件时,出现以下错误:
错误:缺少JavaFX运行时组件,需要运行此应用程序。
我使用Maven作为我的存储库管理器,并且我的Maven安装成功。
注意:在我的IntelliJ构建工件中,我可以看到IntelliJ包括JavaFX及其所有库。
a) 对于我的Maven项目,诀窍在于使用一个额外的启动类,该类不继承自javafx.application.Application:
public class GUIStarter {
public static void main(final String[] args) {
GUI.main(args);
}
}
JavaFx 的依赖项已经在我的 pom.xml 文件中包含如下:
<!-- JavaFx -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>12</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>12</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics </artifactId>
<version>12</version>
<classifier>win</classifier>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>12</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-web</artifactId>
<version>12</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-media</artifactId>
<version>12</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-swing</artifactId>
<version>12</version>
</dependency>
为了将FXML文件包含在您的构建中,您可能需要将它们定义为资源:!-- define JavaFx files as resources to include them in the jar -->
<resource>
<directory>${basedir}/src/main/java/foo/baa/view</directory>
<filtering>false</filtering>
<targetPath>foo/baa/view</targetPath>
</resource>
b)作为替代方案,可以使用额外的Maven插件“javafx-maven-plugin”来构建JavaFX应用程序,请参见示例项目:https://openjfx.io/openjfx-docs/#maven。(对我来说并没有起作用。我有几个POM文件,并希望在子项目中引用JavaFX依赖项。我的主类无法被javafx-maven-plugin找到。)
module-info.java
文件来描述项目“需要”的所有模块,并允许您向其他模块“打开”它们。如果您有一堆Maven依赖项,则还必须将它们添加到需要列表中。(IntelliJ可以轻松完成此操作-查找代码中没有要求的错误并按alt-enter键)
一切都已经与模块等配合正常工作,我不得不使用Maven Shade插件来制作一个Fat Jar,将一切组合在一起。然后就可以通过命令行运行jar包。
然而,在经过两天的痛苦后,当我的Java 11代码@#$%@#终于正常工作后,我回到了Java 8(使用Correto SDK进行最新版本),因为Java 11没有打包功能,IntelliJ也无法为您完成该任务。