模块声明中的requires和requires 静态模块语句有什么区别?
例如:
module bar {
requires java.compiler;
requires static java.base;
}
模块声明中的requires和requires 静态模块语句有什么区别?
例如:
module bar {
requires java.compiler;
requires static java.base;
}
requires
子句表示在编译和运行时需要所需的模块。因此,当模块系统在模块解析期间(处理模块描述符和解决依赖关系的阶段)遇到这样的子句时,它会搜索可观察模块的宇宙(JDK中的模块和模块路径上的模块)并抛出错误如果它没有找到模块。
requires static
子句表示在运行时可选的依赖关系。这意味着在编译时模块系统的行为与上述完全一样。
另一方面,在运行时,它主要忽略requires static
子句。如果遇到一个,它不会解决它。这意味着,如果一个 observable 模块仅被 引用requires static
,它不会进入模块图!起初这可能有点令人惊讶。另一方面,如果模块以其他方式(由其他模块要求,使用手动添加--add-modules
,由服务绑定绘制)进入图形,则所有对其具有可选依赖关系的模块都可以读取它。
两者之间的主要区别在于,在
requires static foo.module;
依赖在静态阶段,编译期间是强制性的,但在动态阶段,执行期间是可选的,而另一方面
requires bar.module;
添加以声明模块在编译时和运行时都依赖于其他一些模块。