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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:13:17