为什么我们需要在Java-9模块系统中要求静态?

时间:2019-05-16 14:00:31

标签: java java-9 java-module jigsaw

我开始学习拼图Java-9功能并阅读了一些文章/视频。

我不明白可选依赖项的概念(requires static

来自article

引用:

  

当一个模块需要针对另一个模块的类型进行编译时   但不想在运行时依赖它,它可以使用需求   静态子句。如果foo需要静态bar,则模块系统将运行   在编译和运行时有所不同:

     

在编译时,必须存在bar否则将出现错误。中   foo可以读取编译栏。
    在运行时,可能不存在bar   这将不会导致错误或警告。如果存在,则为   foo可读。

所以我想知道几件事:

  1. 在编译期间使模块依赖于另一个模块的原因是什么?有什么例子吗?像龙目岛这样的乐器?

  2. java之前的java-9中的可选依赖项的任何类似物吗?

P.S。

我发现了另一种解释: 来自article的引用:

  

有时我们编写的代码引用了另一个模块,但是该用户   我们的图书馆永远都不想使用。

     

例如,我们可能会编写一个实用函数来漂亮地打印我们的   存在另一个日志记录模块时的内部状态。但是,并非每个   我们图书馆的消费者将需要此功能,而他们并不需要   想要包括一个额外的日志记录库。

     

在这些情况下,我们要使用可选的依赖项。通过使用   需要静态指令,我们创建了仅编译时依赖项:

module my.module {
    requires static module.name;
}

但是对我来说绝对不清楚。谁能以简单的方式解释它?

2 个答案:

答案 0 :(得分:3)

  1. 那里有很多库,只有在编译时才有意义。通常,这处理的注释仅在开发过程中提供帮助(例如,防止错误,减少样板)。一些示例包括:


    这些注释的RetentionPolicy往往是SOURCECLASS,这意味着它们在运行时没有用(甚至不可用)。部署时,为什么将这些依赖项与应用程序的其余部分一起提供?如果没有requires static,则在部署时将被强制 包含它们,否则由于缺少依赖项,您的应用程序将无法启动。

  2. 您还将这些依赖项声明为Java 9之前的可选。许多重要的Java项目都使用诸如Maven或Gradle之类的构建工具。除了这些工具会自动构建和测试项目外,依赖管理是其中的主要功能。我对Maven不够熟悉,但是在使用Gradle时会使用:

    dependencies {
        compileOnly 'group.id:artifact-id:version'
    }
    

    声明运行时不需要的依赖项。

答案 1 :(得分:1)

如果从属模块应该在编译时可用,但在rumtime时是可选的,则这种类型的依赖关系称为可选依赖关系。我们可以使用static关键字指定可选的依赖项。

注意:static关键字用于表示“此依赖项检查在编译时是必需的,而在运行时是可选的。”

例如1

module moduleB {
  requires moduleA;
}

moudleA应该在编译和发布时可用。它不是可选的依赖项。

Eg2。

module moduleB {
   requires static moduleA;
}

在编译时,moduleA应该可用,但是在运行时它是可选的,即,即使在运行时,甚至moduleA都不可用,JVM将执行代码。