JPMS的static与transitive修饰符是否兼容?组合作用解析
JPMS中
requires static transitive指令的作用 JPMS的requires指令支持static和transitive两个限定符,针对模块foo,单独使用时的效果如下:
requires static bar;:使bar模块在运行时的解析为可选requires transitive bar;:允许所有读取foo的模块自动读取bar。根据java.lang.module文档,这意味着bar必须在编译时和运行时都存在
不过还存在第三种合法的组合方式:
module foo { requires static transitive bar; }
该组合的作用解析
根据官方文档描述:
带有
static修饰符的requires指令表示运行时的可选依赖。如果模块声明requires static M,则解析过程不会在可观察模块中搜索M来满足依赖。但如果M在步骤1中被递归枚举,那么所有被枚举且声明requires static M的模块都将读取M。
其中“步骤1”指的是通过X requires transitive Y关系计算根模块集闭包的过程。
简单来说,这个组合的核心逻辑是:bar模块并非强制要求存在,但如果它通过transitive依赖链被纳入根模块的闭包(即步骤1中被枚举到),那么所有读取foo的模块都会自动读取bar;如果bar没被步骤1枚举到,运行时解析也不会主动去搜索它来满足依赖。
实际场景中的生成
在使用bnd-maven-plugin时经常会生成这类指令,该插件会将OSGi的resolution:=optional指令映射为static,将uses:=...指令映射为transitive。
内容的提问来源于stack exchange,提问作者Piotr P. Karwasz
相关产品推荐
相关产品推荐

