
本文旨在解决在使用Java 19和JLink工具创建JavaFX应用程序镜像时,由于java.xml.bind模块依赖缺失java.activation模块而导致的错误。文章将提供替代方案,避免直接使用JLink,并推荐使用更灵活的打包工具,例如JPackageScriptFX,以处理非模块化的依赖项。
在使用Java 19尝试通过JLink打包JavaFX应用时,可能会遇到如下错误:
Error: Module java.activation not found, required by java.xml.bind java.lang.module.FindException: Module java.activation not found, required by java.xml.bind
这个错误表明java.xml.bind模块依赖于java.activation模块,但在Java 19中,java.activation模块可能不再默认包含。直接使用JLink创建可执行镜像的方法,在处理非模块化的代码时,往往会遇到各种依赖问题。
替代方案:使用JPackageScriptFX等打包工具
由于JLink对模块化的严格要求,对于包含非模块化依赖的项目,推荐使用其他打包工具,例如JPackageScriptFX。
立即学习“Java免费学习笔记(深入)”;
JPackageScriptFX是一个基于JPackage的脚本,简化了JavaFX应用的打包流程,并且能够更好地处理非模块化的依赖。它允许你创建适用于不同平台的安装包,而无需手动管理复杂的模块依赖关系。
JPackageScriptFX的优势
- 简化打包流程: 自动处理依赖项,减少手动配置。
- 支持非模块化依赖: 能够处理未模块化的第三方库。
- 跨平台支持: 生成适用于Windows、macOS和Linux的安装包。
使用步骤
下载和安装JPackageScriptFX: 访问GitHub仓库 https://www.php.cn/link/da38769133a761c1db1bf48db6e4a135 并按照说明进行安装。
配置JPackageScriptFX: 根据你的项目需求配置脚本。这通常涉及指定主类、依赖项和应用图标等。
运行脚本: 执行脚本以生成安装包。
./jpackage.sh # 或者根据你的操作系统选择相应的脚本
示例配置
一个简单的jpackage.sh配置示例:
# 应用名称
APP_NAME="MyJavaFXApp"
# 主类
MAIN_CLASS="com.example.Main"
# 模块路径
MODULE_PATH="lib:mods"
# 添加模块
ADD_MODULES="javafx.controls,javafx.fxml"
# 输出目录
OUTPUT_DIR="dist"
# 执行JPackage
jpackage \
--name "$APP_NAME" \
--module "$MAIN_CLASS" \
--module-path "$MODULE_PATH" \
--add-modules "$ADD_MODULES" \
--dest "$OUTPUT_DIR" \
--input "target/jpackage" \
--main-class "$MAIN_CLASS"注意事项:
- 确保你的项目已经构建完成,并且所有的依赖项都在指定的MODULE_PATH或类路径下。
- 根据你的项目结构和依赖关系调整脚本中的参数。
- 如果你的项目依赖于未模块化的JAR文件,可以将它们放在lib目录下,并在脚本中包含它们。
总结
虽然JLink是Java官方提供的模块化打包工具,但在处理包含非模块化依赖的JavaFX项目时,可能会遇到问题。使用JPackageScriptFX等更灵活的打包工具,可以简化打包流程,并更好地处理非模块化的依赖项,从而更轻松地创建可分发的应用程序。在未来,随着Java生态的不断发展,越来越多的库将会模块化,届时JLink将会发挥更大的作用。











