我正在尝试创建一个可运行的 JavaFX JAR。
我已经编译了所有文件(使用 Java 8,主要版本 52),创建了一个 Manifest 文件并创建了一个包含这些目录和文件的 zip:
应用程序.zip
META-INF
MANIFEST.MF
lib
javafx-controls.jar
...
animals
Dog.class
Cat.class
shapes
Circle.class
Square.class
controllers
AllAnimalsController.class
views
allanimals.fxml
Main.class
然后我将 zip 重命名为
app.jar
。
lib
文件夹包含所有JavaFX依赖项。我可以通过这样做来运行罐子:
java --module-path lib --add-modules javafx.controls,javafx.fxml -jar app.jar
但前提是我从包含
lib
文件夹的目录运行 jar:
running-jar-test-directory
app.jar
lib
javafx-controls.jar
...
我无法使用自己的
lib
文件夹(打包在 jar 内)运行 jar,而不依赖位于 lib
中的外部 running-jar-test-directory
文件夹。
我该如何实现它?
我尝试更新我的
MANIFEST.MF
以包含 jar
文件夹中的所有 lib
文件,如下所示:
Manifest-Version: 1.0
Class-Path: lib/javafx-controls.jar ...
Main-Class: Main
但它不起作用 - 我在尝试运行 jar 时遇到错误:
java --add-modules javafx.controls,javafx.fxml -jar app.jar
Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.controls not found
java -jar app.jar
Error: Could not find or load main class Main
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application
我知道有用于创建 JavaFX jar 的工具/插件,但我想了解如何手动执行此操作。
我真的很想了解在没有插件的情况下它是如何完成的
然后转到入门文档并按照说明进行操作。
运行时图像部分|非模块化项目 |命令行。
尽管 StackOverflow 上不鼓励仅提供链接答案,但我不会在此处重现这些说明,因为它们可能会过时,而且更糟糕的是,有人可能会认为这是个好主意而关注它们。
引用文档:
您还可以在命令行上为 JavaFX 项目创建可运行的 fat jar。
警告:这是一个令人沮丧的繁琐且容易出错的手动过程,应使用 Maven 的阴影插件或 Gradle 的 jar 任务来避免,以防 jlink 不适用。
此 JRE 是特定于平台的。然而,如果包含来自每个平台的不同本机库,它可以很容易地成为多平台 jar。这需要下载适用于所有平台的 JavaFX SDK,提取所有必需的 jar(例如,javafx.graphics 对于每个平台都是不同的),并复制所有本机库,如上所示。正如上面提到的,这个过程不应该手动完成。