包 com.fasterxml.jackson.annotation 不可见

Mr.*_*ong 5 java java-platform-module-system java-9

当我在 Java 9 中编译 Spring Boot 应用程序时,它会在出现以下几条消息后失败:

package com.fasterxml.jackson.annotation is not visible
    (package com.fasterxml.jackson.annotation is declared in the unnamed module, but module com.fasterxml.jackson.annotation does not read it)
Run Code Online (Sandbox Code Playgroud)

有人能告诉我这是怎么回事吗?据我了解,任何不在 Java-9 模块中的 Java 9 之前的代码都将成为未命名模块的一部分,其中会公开任何内容。

我在我的模块中使用它作为注释,如下所示:

@JsonIgnore
public Week getNextWeek()
{
    Calendar instance = this.getFirstDay();
    instance.set(Calendar.WEEK_OF_YEAR, this.week + 1);
    return new Week(instance);
}
Run Code Online (Sandbox Code Playgroud)

那么,如果 com.fasterxml.jackson.annotation 包就是这种情况,为什么错误引用了具有该名称的模块,以及为什么它不读取它会出现问题?

Jai*_*ims 6

引用JigSaw 规范

未命名的模块导出其所有包。这可以实现灵活的迁移,我们将在下面看到。但是,这并不意味着命名模块中的代码可以访问未命名模块中的类型。事实上,命名模块甚至不能声明对未命名模块的依赖。

您正在寻找的是自动模块。在自动模块中, ajar可以放置在模块路径中,并且会自动从其自身派生出模块名称jar。如果您使用 Maven,那应该是artifactId.

因此,如果您jackson-annotations在 Maven 中使用如下:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.0.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

您仍然需要在您的内部定义它module-info.java

module example {
    requires jackson.annotations;
}
Run Code Online (Sandbox Code Playgroud)

之后,您可以在模块中自由使用注释。