maven 在模块化项目中添加非模块化依赖关系

kq0g1dla  于 2023-08-03  发布在  Maven
关注(0)|答案(1)|浏览(164)

我对模块化项目的系统很陌生。在上下文中,我开始了一个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.javaHere的数据。
即使如此,对于未来我不知道如何添加一个没有module-info.java的依赖项。
提前感谢您的帮助!

kse8i1jr

kse8i1jr1#

您的问题与在模块化上下文中使用非模块化依赖无关。正如您所发现的,所讨论的依赖性是模块化的;它具有module-info描述符。这个模块的名称是org.jetbrains.annotations
问题是依赖是一个 * 编译时 * 依赖。您已经通过在POM文件中使用<scope>compile</scope>将其显式标记为这样1。这意味着Maven会在 compile-time 将依赖项放在module-path上,而不是
run-time。这会导致错误,因为您有:

requires org.jetbrians.annotations;

字符串
这告诉 *Java平台模块系统 * DVDIndexer模块在编译时和**运行时都需要org.jetbrains.annotations模块。要解决此问题,您需要使用以下指令:

requires static org.jetbrains.annotations;


在这个上下文中,static关键字意味着必需的模块在运行时是可选的(但在编译时仍然是必需的)。该特征的主要目的是允许模块在编译时需要另一个模块,而不强制所述另一个模块在运行时出现。换句话说,它只允许编译时依赖。
1.这是好事。java-annotations库被设计为仅编译时依赖项。它的目的是提供更好的文档,并可能允许代码分析器更好地分析代码中的潜在错误。但是库本身没有定义运行时行为,注解都有CLASS的保留策略(这意味着它们不能通过反射可见)。因此,没有理由在运行时要求依赖项。

相关问题