如何为Java命名模块指定Manifest文件的Add-Exports配置
针对命名模块免手动指定--add-exports参数的解决方案如下:
1. 针对mymodule为可执行主模块的场景
MANIFEST.MF中的Add-Exports配置仅作用于未命名模块,且从JDK 17开始该配置默认被安全规则拦截,无法实现预期效果。要让导出规则直接作用于命名模块mymodule,可选择以下两种方案:
- 轻量方案:使用参数文件封装启动命令
在JAR包同级目录创建参数文件(比如命名为start.args),内容写入所有需要的启动参数:
运行时仅需执行--add-exports java.base/sun.security.x509=mymodule --module-path . --module mymodule/mymodule.Mainjava @start.args即可,无需每次手动输入长参数。也可将该命令封装为对应系统的启动脚本(Windows下写.bat文件,Linux/macOS下写.sh文件),用户直接点击脚本即可启动程序。 - 生产级方案:自定义运行时镜像
用jlink工具将mymodule和依赖的JDK模块打包为独立运行时,内置导出规则:
生成的jlink --add-exports java.base/sun.security.x509=mymodule --module-path . --add-modules mymodule --output myruntimemyruntime目录自带定制化JRE,运行时直接执行myruntime/bin/java --module mymodule/mymodule.Main即可,不需要额外添加任何参数。
2. 针对mymodule为底层依赖库的场景
不需要为所有上层调用模块单独配置导出规则,可通过两种方式处理:
- 若上层应用为非模块化应用,只需在你的依赖库接入文档中明确标注需要添加的
--add-exports参数,上层应用启动时统一配置即可。 - 若上层应用为模块化应用,可在你的依赖库的构建脚本(Maven/Gradle)中配置传递性的模块参数,上层应用引入你的依赖时,构建工具会自动将所需的
--add-exports参数添加到编译、运行阶段的参数列表中,不需要上层开发者手动配置。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

