在模块声明中,“requires”和“requires static”模块语句有什么区别?
例如:
module bar {
requires java.compiler;
requires static java.base;
}
在模块声明中,“requires”和“requires static”模块语句有什么区别?
例如:
module bar {
requires java.compiler;
requires static java.base;
}
requires
子句表示编译和运行时需要所需的模块。因此,当模块系统在模块分辨率期间(处理模块描述符并解析依赖项的阶段)遇到这样的子句时,它会搜索可观测模块的宇宙(JDK中的模块和模块路径上的模块),如果没有找到该模块则会抛出错误。
requires static
子句表示运行时可选的依赖关系。这意味着在编译时,模块系统的行为与上述完全相同。
在运行时,它大多数情况下会忽略requires static
子句。如果遇到一个,它不会解析它。也就是说,如果仅使用requires static
引用可观测模块,则其不会进入模块图!这可能会有点令人惊讶。但是,如果模块以其他方式进入图形中(由某个其他模块要求,使用--add-modules
手动添加,被服务绑定吸引),则所有具有对其可选依赖项的模块都可以进行读取。
requires static foo.module;
依赖关系在静态阶段(编译期)是强制性的,但在动态阶段(执行期)是可选的,另一方面
requires bar.module;
在编译时和运行时,通过名称声明模块依赖于其他模块。
requires
指令本身上的static
修饰符。 - Naman