未导出的Java包能否被未命名模块访问?权限控制疑问
关于Java模块系统包访问限制的问题解答
你的操作没有问题,这是Java模块系统的设计规则导致的:
- 未命名模块(没有
module-info.java的项目)不受模块导出规则约束。当你的依赖项目是未命名模块时,JVM会把引入的模块化JAR当作传统类路径下的普通JAR处理,不会检查module-info.java里的导出声明,所以能访问org.test.b这类未导出的包。 - 只有当依赖项目也成为显式模块(添加
module-info.java并声明对test模块的依赖)时,模块系统才会强制执行导出规则,此时访问未导出的org.test.b就会触发你看到的编译错误。
至于你疑惑的JDK内部包(比如jdk.internal.misc.Unsafe)的情况,这是因为JDK本身是特殊的模块化实现:
JDK的模块在启动时默认启用了严格的封装机制,即使是未命名模块,也无法访问JDK模块中未导出的内部包。这是JDK为了保证自身内部API安全特意做的限制,和普通自定义模块的兼容模式逻辑不同。
如果想要严格限制自定义模块的包访问,唯一的办法是让所有依赖该模块的项目都使用显式模块(即添加自己的module-info.java)。
内容的提问来源于stack exchange,提问作者StudioCode
相关产品推荐
相关产品推荐

