我对模块化项目的系统很陌生。在上下文中,我开始了一个JavaFX项目17版本,现在我有了一个以前从未听说过的module-info.java
文件。有了更多的信息,我开始理解它是如何工作的。但我有个问题。
在我的项目中,我使用了Maven并添加了这个依赖:
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>24.0.1</version>
<scope>compile</scope>
</dependency>
字符串
我想用@NotNull
,@Nullable
等...我的项目中的注解。但是当我尝试使用它时,我运行时有这个错误:
java: cannot find symbol
symbol: class NotNull
location: class be.machigan.dvdindexer.services.DVDFolder
型
所以我想把它添加到module-info.java
文件中,如下所示:
module DVDIndexer {
requires javafx.controls;
requires javafx.fxml;
requires com.google.gson;
requires org.jetbrains.annotations; // <- here
opens be.machigan.dvdindexer to javafx.fxml, com.google.gson;
opens be.machigan.dvdindexer.services to com.google.gson;
exports be.machigan.dvdindexer;
exports be.machigan.dvdindexer.controllers;
opens be.machigan.dvdindexer.controllers to javafx.fxml;
}
型
但是当我运行它时,我有这个错误:
java: module not found: org.jetbrains.annotations
型
由于这个错误,IDE无法识别注解(就像上面的其他情况一样)。
我在Internett上搜索,我已经了解到,可能会发生错误,因为依赖没有module-info.class
文件。但是我在Github上搜索依赖项,有一个module-info.java
。Here的数据。
即使如此,对于未来我不知道如何添加一个没有module-info.java
的依赖项。
提前感谢您的帮助!
1条答案
按热度按时间kse8i1jr1#
您的问题与在模块化上下文中使用非模块化依赖无关。正如您所发现的,所讨论的依赖性是模块化的;它具有
module-info
描述符。这个模块的名称是org.jetbrains.annotations
。问题是依赖是一个 * 编译时 * 依赖。您已经通过在POM文件中使用
<scope>compile</scope>
将其显式标记为这样1。这意味着Maven会在 compile-time 将依赖项放在module-path上,而不是在 run-time。这会导致错误,因为您有:字符串
这告诉 *Java平台模块系统 *
DVDIndexer
模块在编译时和**运行时都需要org.jetbrains.annotations
模块。要解决此问题,您需要使用以下指令:型
在这个上下文中,
static
关键字意味着必需的模块在运行时是可选的(但在编译时仍然是必需的)。该特征的主要目的是允许模块在编译时需要另一个模块,而不强制所述另一个模块在运行时出现。换句话说,它只允许编译时依赖。1.这是好事。java-annotations库被设计为仅编译时依赖项。它的目的是提供更好的文档,并可能允许代码分析器更好地分析代码中的潜在错误。但是库本身没有定义运行时行为,注解都有
CLASS
的保留策略(这意味着它们不能通过反射可见)。因此,没有理由在运行时要求依赖项。