23

模块声明中的requiresrequires 静态模块语句有什么区别?

例如:

module bar {
    requires java.compiler;
    requires static java.base;
}
4

2 回答 2

24

requires子句表示在编译和运行时需要所需的模块。因此,当模块系统在模块解析期间(处理模块描述符和解决依赖关系的阶段)遇到这样的子句时,它会搜索可观察模块的宇宙(JDK中的模块和模块路径上的模块)并抛出错误如果它没有找到模块。

requires static子句表示在运行时可选的依赖关系。这意味着在编译时模块系统的行为与上述完全一样。

另一方面,在运行时,它主要忽略requires static子句。如果遇到一个,它不会解决它。这意味着,如果一个 observable 模块仅被 引用requires static,它不会进入模块图!起初这可能有点令人惊讶。另一方面,如果模块以其他方式(由其他模块要求,使用手动添加--add-modules,由服务绑定绘制)进入图形,则所有对其具有可选依赖关系的模块都可以读取它。

于 2017-10-03T07:56:58.803 回答
5

两者之间的主要区别在于,在

requires static foo.module;

依赖在静态阶段,编译期间是强制性的,但在动态阶段,执行期间是可选的,而另一方面

requires bar.module;

添加以声明模块在编译时和运行时都依赖于其他一些模块。

于 2017-10-03T04:46:47.700 回答