Eclipse环境下Java模块requires transitive配置不生效问题
问题原因分析
requires transitive的传递性有明确的作用边界:当模块X声明requires transitive 模块Y时,所有依赖模块X的其他模块,可以自动获得模块Y的可读权限。但这个传递只会传递模块Y自身显式用transitive声明的公开依赖,不会传递模块Y的普通私有requires依赖。
对应到你的场景问题根源非常明确:
javaModuleA中对interfacesModule的依赖是普通的requires interfacesModule,属于javaModuleA的内部私有依赖,不会传递给依赖javaModuleA的其他模块- 你在
mainModule中声明的requires transitive javaModuleA,作用是把javaModuleA本身暴露给mainModule的下游消费者,不会帮你把javaModuleA的私有依赖interfacesModule引入到mainModule的可读范围内 - 所以注释掉
mainModule里的requires interfacesModule后,mainModule没有权限读取interfacesModule下的类,自然会报MyInterface不可访问的错误。
修复方案
修改javaModuleA的模块声明,把对interfacesModule的依赖改为transitive公开传递即可:
module javaModuleA { requires transitive interfacesModule; exports com.my.moduleA; }
修改后所有依赖javaModuleA的模块,都会自动获得interfacesModule的可读权限,此时你可以删掉mainModule里的requires interfacesModule声明,程序也能正常运行。
内容的提问来源于stack exchange,提问作者Student
相关产品推荐
相关产品推荐

