Can not run JAVAFX .jar File (many errors occurred)(无法运行JavaFX.jar文件(出现许多错误))
问题描述
为我的JavaFX程序创建.jar文件时遇到问题。
重要信息:
JavaFX版本:17
Java版本:17
IDE:IntelliJ
Project使用Maven
..................................................................................................................................................................................................................................................
文件结构:
模块文件:
POM文件:
我创建了一个JAR,如下所示:
当我这样运行JAR时:
我收到以下错误:
当我从终端使用命令 java --module-path C:UsersaenasDesktopjavafx-sdk-17.0.1 --add-modules javafx.fxml,javafx.graphics,java.sql -jar DevicesInfoCards.jar
我收到以下错误
当我尝试以下命令时:
我收到以下错误
我在SO中看了很多教程和答案,但我没有得到任何新的东西。
解决方案之一是将以下内容添加到POM文件中:
我无法解决最后一个错误,虽然我确实使用Java 11编译了该程序,但同样的错误也出现了。
我这样做了(将代码添加到POM文件),但我也收到了以下错误:
我还尝试使用Main方法创建一个新类,并让它调用Main
Cless,但这不起作用,我得到了以下错误:
尽管我已将POM文件中的所有<mainclass></mainclass>
teg更改为正确的新主类,但仍收到相同的错误。
提前感谢您的帮助;
更新
我所做的是删除了模块信息文件,删除了POM文件中的所有JavaFX依赖项,所以我的POM现在看起来是这样的:
当我运行mvn package
时,得到以下输出:
java -jar DevicesHistoryCards_Maven2.jar
时,我得到了以下信息:
Error: Unable to access jarfile DevicesHistoryCards_Maven.jar
为什么我无法访问它?它是在哪里创建的?
推荐答案
此答案为打包和分发您的应用程序提供了两种替代方案,一种(不推荐创建FAT JAR文件),另一种(使用JLINK或JPackage)。
相关问题
我认为这个问题的核心是:
- Maven Shade JavaFX runtime components are missing
因为,正如在副本中一样,您是:
- 使用Maven。
- 使用JavaFX。
- 希望创建可执行JAR。
但是,我已经添加了一个答案,列出了您必须在项目中进行更改才能使其正常工作的特定内容。
不推荐使用胖罐子
创建FAT JAR不是当前支持的打包JavaFX应用程序的方法。
openjfx.io project提供了带有JavaFX的FAT JAR的模板。
pom.xml project file在此。
如果不清楚下面的步骤,请研究有关JavaFX和示例Openjfx.io项目的maven shading的链接问题。
将您的项目转换为可以打包为胖罐子的步骤:
在pom.xml文件中定义您的应用程序所需的所有JavaFX依赖项。
- Maven将传递地导入,因此您不需要直接依赖于低级别的构件,如JavaFX-base,只需要较高级别的构件,如JavaFX-Controls和JavaFX-fxml(如果您使用它的话)。
它应该是一个非模块化项目(删除您的模块-info.java)
它需要单独的launcher class(创建一个)
它需要使用maven shade插件合并JAR(使用该插件)
若要使其跨平台,您需要提供分类依赖项(添加它们)
要支持M1 Mac,您需要
- 一个额外的分类器依赖项mac-aarch64(添加)
- JavaFX 17.0.2+(升级到该版本)。
您需要使用Maven依赖项,而不是JavaFX SDK(您可以删除SDK)。
- maven项目与SDK附带的JAR不同。
- maven项目包括本机代码,而SDK中的JAR不包括,本机代码在SDK分发版中的单独本机库文件中提供。
- 通过单独的下载,您可以获得包含Java代码和本机代码的jmod文件,但这些文件与Maven shade进程不兼容,可以用于jlink进程(就像maven构件一样)。
使用transformer in the shade plugin指定主类,而不是使用maven-jar-plugin(您应该删除maven-jar-plugin部分)。
使用
mvn package
打包应用程序,不要使用IDE中的内置项目生成器- 请勿使用IDEA或Eclipse项目生成系统。
- IDE项目生成系统当前不支持正确生成包含JavaFX运行时组件的可执行JAR,它们将生成项目,但如果您尝试执行它们,它们将显示错误。
mvn package
步骤将生成警告,但它可能仍然有效:要运行,只需使用以下命令,不使用其他命令:
这假设用户已正确:
- 安装了兼容的JRE版本。
- 已将系统路径配置为包括包含相应
java
二进制文件的目录。 - 用户的当前目录是包含阴影JAR的目录。
执行步骤将生成警告,但它可能仍会工作:
不再为任何内容指定指向JavaFX SDK的路径,不再需要它来支持此开发管道。
不要指定模块路径,因为您只是在类路径(即JAR文件)之外运行应用程序及其依赖项。
- 只有核心JRE在模块路径上,这是隐式的,因为核心JRE类在JRE模块启动路径上。
您正在编译Java 17到Java 17字节码(您的maven编译器插件的源代码和目标是17)
- 因此您必须在Java 17+版本上运行它,否则它将不起作用,您将收到字节代码错误。
我可能漏掉了一个步骤,但是,如果我没有漏掉一个步骤,而您做到了所有这些,那么它将适用于JRE/JavaFX 17.0.2。生成的JAR可以在兼容平台上使用兼容的预安装JRE执行。
推荐方法:jlink或jPackage
建议构建jlink
镜像:
- 使用JavaFX-maven-plugin
mvn javafx:jlink
命令- 通过设置JavaFX-maven-plugin的
jlinkZipName
参数将其汇编为压缩包。 - 确保您拥有完全模块化的应用程序:
- 在您的应用程序中定义
module-info.java
文件。 - 确保您的所有依赖项也定义了
module-info.java
文件。
- 在您的应用程序中定义
- 通过设置JavaFX-maven-plugin的
- 若要运行,请解压缩压缩包并使用jlink创建的启动脚本。
或者,您可以使用jpackage
创建本机安装程序,例如:
JPackageScriptFX对于非模块化应用,
或
用于模块化应用的Akmanjpackage-maven-plugin。
应用程序的用户可以更轻松、更可靠地使用应用程序,因为除了您的应用程序之外,他们不需要获取和安装兼容的Java运行时。
外部包装资源
有关包装的详细信息,请参阅:
- Stackoverflow JavaFX tag wiki
- openjfx.io Runtime image documentation
- How to create a standalone .exe in Java (that runs without an installer and a JRE)
常见问题
已从POM文件中删除所有JavaFX依赖项
不要这样做,请在pom.xml文件中包含您的应用程序使用的JavaFX依赖项(以及任何必需的第三方依赖项)。
您不需要包括不使用的JavaFX依赖项
您不需要显式列出将传递导入的依赖项,例如JavaFX-base。
其中是命令
mvn package
创建的.jar
文件
当您运行程序包步骤时,这将列在日志文件中:
它同时创建阴影JAR和未阴影JAR,然后将未阴影JAR替换为阴影JAR。
要查看JAR文件的内容,可以运行:
在您的示例中:
里面会有很多东西。JAR将包括您的应用程序代码、来自您的依赖库的所有代码、所有JavaFX Java代码以及您在pom.xml中为匹配目标分发平台而定义的分类的JavaFX依赖项的JavaFX本机代码(例如,Windows DLL)。
如果您使用openjfx fat jar sample pom.xml中的阴影定义,它将使用阴影JAR的分类器并将其输出到单独的目录中,因此阴影JAR不会覆盖目标JAR,而是在<project directory>/shade
文件夹中创建一个单独的JAR。
如果您不想使用阴影JAR的分类器,则不需要这样做。
有关详细信息,请参阅:
attaching the shaded artifact
默认情况下,插件将用阴影构件替换项目的主构件。如果原始构件和着色构件都应该安装/部署到存储库中,则可以配置插件以将着色构件附加为辅助构件
克隆OpenJFX示例项目以验证您的环境
如果您仍然有问题,请从git克隆openjfx sample project并尝试生成它,以确保在使用已知良好的项目时,您可以在您的环境中正确运行该打包。
这篇关于无法运行JavaFX.jar文件(出现许多错误)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!