我的JavaFx
应用程序从源代码运行得很好,但是当我编译为单个jar文件时,出现错误消息:
错误:缺少JavaFX运行时组件,这些组件是运行此应用程序所必需的。
我正在使用Maven
作为存储库管理器,并且使用Maven的安装已成功完成。
注意:在我的Intellij
构建工件中,我看到Intellij
包括JavaFx
及其所有库
答案 0 :(得分:1)
a)对于我的Maven项目,诀窍是使用不继承自javafx.application.Application:
的额外启动器类public class GUIStarter {
public static void main(final String[] args) {
GUI.main(args);
}
}
我的pom.xml中包含JavaFx依赖项,如下所示:
<!-- 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无法找到我的主类。)
答案 1 :(得分:0)
在Java 11中,JavaFX组件已被删除到它们自己的SDK中,因此在运行时将无法在运行时中找到它们。
JavaFX页面上有进行操作的说明:https://openjfx.io/openjfx-docs/#install-javafx
简而言之,您必须通过添加javafx模块(作为在命令行上传递的选项或使用模块化项目)来编译/运行。
我发现使用Maven和IntelliJ的模块化项目对我来说效果最好。 https://openjfx.io/openjfx-docs/#IDE-Intellij
在模块化方法中,您有一个module-info.java
文件,该文件描述了项目“需要”的所有模块,并允许您将它们“打开”到其他模块。如果您有一堆Maven依赖项,则也必须将其添加到需求列表中。 (IntelliJ可以轻松实现-在代码中找到不需要的错误,然后按alt输入)
一旦一切都与模块等一起使用,我必须使用我认为的Maven阴影插件制作一个Fat Jar,以将所有内容组合在一起。然后它将可以从命令行运行jar。
但是,经过2天的痛苦之后,我的Java 11代码@#$%@#工作了之后,我又回到了Java 8(使用最新版本的correto SDK),因为Java 11没有包装,而IntelliJ可以为你做。