You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

何时需要使用JVM参数--add-exports <module>/<package>=ALL-UNNAMED?

为什么JPMS中需要用到--add-exports ...=ALL-UNNAMED?

首先得澄清一个常见误解:ALL-UNNAMED并不是让所有JPMS模块(命名+未命名)都能访问指定包——它只针对所有未命名模块。命名模块要访问的话,得用ALL-MODULES或者单独指定模块名。

回到问题本身:既然未命名模块本来就能“读取”所有模块的所有包,为啥还要用--add-exports ...=ALL-UNNAMED?这是因为“读取权限”和“访问非导出包的权限”是两回事:未命名模块确实能读取任何命名模块,但默认情况下,它依然不能访问命名模块里没有被导出的包——只有当命名模块主动导出(或者通过--add-exports强制导出)某个包给它时,它才能访问该包的类/方法。

下面是几个必须用到ALL-UNNAMED的场景:

  • 旧版依赖(未命名模块)需要访问命名模块的内部包
    比如你有一个基于JPMS的新项目(命名模块),但依赖了一个没模块化的旧jar(放在classpath,属于未命名模块),这个旧jar的代码需要调用你项目里某个非导出包的类。这时候你没法给这个旧jar指定模块名(因为它是未命名的),只能用--add-exports com.your.module/internal.pkg=ALL-UNNAMED,让所有未命名模块(包括这个旧jar)都能访问该内部包。

  • 多个未命名模块共享访问某个内部包
    当classpath上有多个未命名模块(比如多个旧jar)都需要访问同一个命名模块的非导出包时,用ALL-UNNAMED可以一次性开放权限,不用重复添加多个--add-exports(毕竟未命名模块没有唯一标识,没法逐个指定)。

  • 测试代码运行在未命名模块时访问被测模块内部
    有些测试框架或构建工具的旧版本会把测试代码放在classpath(未命名模块)里,而被测代码是模块化的(在modulepath上的命名模块)。如果测试需要访问被测模块的内部包(比如测试私有方法、内部工具类),就需要用--add-exports把被测模块的内部包导出给ALL-UNNAMED,让测试代码能拿到权限。

  • 快速调试或兼容遗留系统
    当你不确定具体哪个未命名模块需要访问内部包,或者只是想快速验证兼容性时,ALL-UNNAMED是最省事的方式——不用逐个排查classpath上的jar,直接开放给所有未命名模块。


内容的提问来源于stack exchange,提问作者Johann Heinzelreiter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:12:53