我开始学习拼图Java-9功能并阅读了一些文章/视频。
我不明白可选依赖项的概念(requires static
)
引用:
当一个模块需要针对另一个模块的类型进行编译时 但不想在运行时依赖它,它可以使用需求 静态子句。如果foo需要静态bar,则模块系统将运行 在编译和运行时有所不同:
在编译时,必须存在bar否则将出现错误。中 foo可以读取编译栏。
在运行时,可能不存在bar 这将不会导致错误或警告。如果存在,则为 foo可读。
所以我想知道几件事:
在编译期间使模块依赖于另一个模块的原因是什么?有什么例子吗?像龙目岛这样的乐器?
java之前的java-9中的可选依赖项的任何类似物吗?
我发现了另一种解释: 来自article的引用:
有时我们编写的代码引用了另一个模块,但是该用户 我们的图书馆永远都不想使用。
例如,我们可能会编写一个实用函数来漂亮地打印我们的 存在另一个日志记录模块时的内部状态。但是,并非每个 我们图书馆的消费者将需要此功能,而他们并不需要 想要包括一个额外的日志记录库。
在这些情况下,我们要使用可选的依赖项。通过使用 需要静态指令,我们创建了仅编译时依赖项:
module my.module {
requires static module.name;
}
但是对我来说绝对不清楚。谁能以简单的方式解释它?
答案 0 :(得分:3)
那里有很多库,只有在编译时才有意义。通常,这处理的注释仅在开发过程中提供帮助(例如,防止错误,减少样板)。一些示例包括:
这些注释的RetentionPolicy
往往是SOURCE
或CLASS
,这意味着它们在运行时没有用(甚至不可用)。部署时,为什么将这些依赖项与应用程序的其余部分一起提供?如果没有requires static
,则在部署时将被强制 包含它们,否则由于缺少依赖项,您的应用程序将无法启动。
您还将这些依赖项声明为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
将执行代码。