需求和模块声明中需要静态之间的区别是什么

Mic*_*zyk 18 java java-9 java-module module-info

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

例如:

module bar {
    requires java.compiler;
    requires static java.base;
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*lai 18

一个requires条款表达了所需要的模块,需要在编译和运行时间.因此,当模块系统在模块解析期间(处理模块描述符和解析依赖关系的阶段)遇到这样的子句时,它会搜索可观察模块的Universe(JDK中的模块和模块路径上)并抛出错误如果找不到模块.

一个requires static从句表示的依赖是在运行时可选.这意味着在编译时模块系统的行为完全如上所述.

另一方面,在运行时,它主要忽略了requires static条款.如果它遇到一个,它不解决它.这意味着,如果只引用了一个可观察模块requires static,它就不会进入模块图形!起初这可能有点令人惊讶.另一方面,如果模块以某种其他方式将其放入图形中(某些其他模块需要,手动添加--add-modules,通过服务绑定引入),所有具有可选依赖性的模块都可以读取它.


Nam*_*man 7

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

requires static foo.module;
Run Code Online (Sandbox Code Playgroud)

依赖关系在编译期间的静态阶段是强制性的,但在执行期间的动态阶段是可选的

requires bar.module;
Run Code Online (Sandbox Code Playgroud)

添加该模块是为了声明该模块在编译时和运行时按名称依赖于某些其他模块。

  • @gstackoverflow lombok 和其他注释处理工具(例如非运行时注释) (5认同)