在模块声明中,需要静态和要求之间有什么区别

2022-09-01 20:58:52

在模块声明中,需要静态模块语句和需要静态模块语句之间有什么区别?

例如:

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

答案 1

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

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

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


答案 2

两者之间的主要区别在于

requires static foo.module;

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

requires bar.module;

添加它是为了声明模块在编译时和运行时都依赖于其他一些模块(按名称)。


推荐