如何使用 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 项目,包括自定义和非模块化依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

Javafx 项目不能用 maven 编译

如何在 IntelliJ IDEA 中创建 JavaFX Maven 项目?

带有 JavaFX 的 Maven 项目(在 `lib` 中有 jar 文件)

如何在 Netbeans 11 中使用 Maven 和 Inno Setup 为 JavaFX 应用程序创建可执行安装程序

Springboot中如何引入本地jar包,并通过maven把项目成功打包成jar包部署

如何发布本地maven项目jar包部署到nexus私服?