JavaFX 21模块化应用:如何将H2、Hibernate自动模块加入类路径
问题:JavaFX 21模块化应用打包时如何处理H2与Hibernate自动模块?
在使用JLink将JavaFX 21模块化应用打包为原生可执行文件时,如何将H2和Hibernate这类自动模块加入类路径?
我尝试将两个JAR包放入resources目录,同时修改module-info.java配置静态依赖:
module module-name { requires static com.h2database; requires static org.hibernate.orm.core; opens package-name.model to org.hibernate.orm.core; opens package-name.interfaces to org.hibernate.orm.core; }
我希望了解在模块化应用中,如何通过类路径处理自动模块的相关问题。
此前得到回复,但如果移除上述requires和opens语句,Hibernate会因不可见导致构建失败。我使用Maven进行构建,jpackage命令如下:
jpackage --dest output --name %1 --type msi --module-path "%PATH_TO_FX_JMODS%;./target/%jarName%" --add-modules %4 --module %5 --win-shortcut --win-menu --win-menu-group %1 --java-options -Xmx2048m --vendor %3 --copyright "Copyright © %year% %3" --icon src/main/resources/package-name/images/icon.ico --app-version %2
根据回复内容,我整理出以下理解:
开发与打包阶段
- 应用能正常运行,是因为将H2和Hibernate作为自动模块使用
运行阶段(通过jpackage)
- 无法运行的原因是jpackage依赖的jlink不支持自动模块依赖
解决方案
不推荐构建非完全模块化的项目,可选方案如下:
- 按照官方建议将项目改为非模块化应用
- 尽可能将自动模块转换为标准模块,实现完全模块化:
- 手动方式:
- 使用
jdeps生成module-info - 修改生成的
module-info(如配置exports等规则) - 用
javac编译module-info - 通过
--file参数手动更新JAR包
- 使用
- Gradle的Badass jlink插件:可将非模块化依赖合并为单个JAR并自动生成
module-info,方便用jlink创建运行时镜像(注:可能不适用于所有软件) - Maven的Moditect插件:可分析项目并自动生成
module-info,检测依赖与包导出内容(不推荐使用)
- 手动方式:
内容的提问来源于stack exchange,提问作者2023
相关产品推荐
相关产品推荐

