如何使用 maven 部署 JavaFX 项目,包括自定义和非模块化依赖项?
Posted
技术标签:
【中文标题】如何使用 maven 部署 JavaFX 项目,包括自定义和非模块化依赖项?【英文标题】:How to deploy a JavaFX project with maven, including custom and non-modular dependencies? 【发布时间】:2022-01-20 19:19:16 【问题描述】:我目前正在尝试部署我的 JavaFX 应用程序(使用 jar 或安装程序,但首选安装程序)。我看到一些消息来源指向使用 jlink,但我尝试过但无济于事。
虽然我可以正常使用 jlink 构建没有问题,但我正在尝试包含我使用 Maven 和 Java 17 制作的自定义序列化实用程序(没有 JavaFX,但它是带有模块信息的单个模块)。要将其导入我的项目,我只是将其添加为依赖项。此外,这种依赖需要 SnakeYAML,我不认为这是一个模块化项目? (后面很重要)
现在,有了这个依赖关系,如果我尝试运行 javafx:jlink,我通常会收到一个错误,例如“jlink 不适用于自动模块”(参考我的序列化实用程序)。
我的设置:
JavaFX 17.0.1 JDK 17.0.1 Maven 3.8.4 IntelliJ IDEA 终极版所以,我主要的两个问题:
我是否应该为 jlink 而烦恼,尤其是在我尝试获取安装程序时? 对于像我的 JavaFX 项目这样的模块化项目,我如何添加来自其他模块化项目的依赖项(以及在序列化实用程序中,以某种方式遮蔽 SnakeYAML)并允许它们使用 JavaFX 进行编译?【问题讨论】:
我edited你的头衔。不要要求最好的做事方式,这是主观的,会让你的问题得到解决。相反,只需询问如何做事,看看你得到什么答案,然后投票或接受你想要的答案。 【参考方案1】:我是否应该为 jlink 而烦恼,尤其是如果我正在尝试获取安装程序?
没有。
您可以在此过程中使用 jlink,但根据我的经验,这不是必需的。此外,jlink 创建的图像可能有点难以与 jpackage 所需的内容集成,无论如何您都需要使用它。
如果您需要安装程序,请使用jpackage
,而不是jlink
。
jpackage既可以链接你的应用程序,也可以创建安装程序,但是jlink只能链接,不能创建安装程序。
对于像我的 JavaFX 项目这样的模块化项目,我如何添加来自其他模块化项目的依赖项(并且在序列化实用程序中,以某种方式遮蔽 SnakeYAML)并允许它们使用 JavaFX 进行编译?
包装时不要遮盖罐子,没有必要。此外,如果 jar 是模块化的,它会破坏它们的模块化并且它们可能无法工作(例如,JavaFX jar 在被遮蔽到 jar 时不受支持)。
要添加编译依赖,你已经在使用Maven了,使用它的编译依赖机制即可。
对于您自己创建的 jar 依赖项,使用 Maven install 命令将依赖项安装到本地存储库中,或者使用存储库管理器中的安装工具(例如 jfrog artifactory),如果您使用的话。
现代 maven 构建过程和 IDE 集成(至少是 Idea)将自动配置正确的路径以编译声明的依赖项,以便它们可以从模块路径中获得,如果它们是模块化和类路径或作为如果它们不是模块化的,则自动模块。
在你的包中包含依赖的 jars。这可以通过两种方式完成:
如果 jar 是模块化的,请将 jar 链接到包中包含的运行时映像:
jlink 和 jpackage 都可以这样做,但是在创建安装程序时,请使用 jpackage 进行链接,而不是 jlink,因为 jpackage 将确保映像中的所有文件都位于安装程序的正确位置,但根据我的经验,jlink 不会使用 Java 17 工具。如果 jar 不是模块化的,则将它们包含在包的 lib 目录中。在包中包含的应用程序的启动脚本中,将非模块化库文件的 lib 目录放在类路径中,以便可以找到它们。
另外,这个依赖需要SnakeYAML,我不相信它是一个模块化项目?
按照以下教程进行操作:
https://github.com/dlemmermann/JPackageScriptFX
JPackageScriptFX 的说明:
演示项目如何使用脚本通过 jdeps、jlink 和 jpackage 工具构建独立的、特定于平台的可执行文件和 JavaFX 应用程序的安装程序
这些脚本不会尝试创建完全模块化的解决方案,而是尝试将现有项目/应用程序(通常使用非模块化的第 3 方依赖项)打包
【讨论】:
以上是关于如何使用 maven 部署 JavaFX 项目,包括自定义和非模块化依赖项?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 IntelliJ IDEA 中创建 JavaFX Maven 项目?
带有 JavaFX 的 Maven 项目(在 `lib` 中有 jar 文件)
如何在 Netbeans 11 中使用 Maven 和 Inno Setup 为 JavaFX 应用程序创建可执行安装程序