Пакет com.fasterxml.jackson.annotation не отображается

Когда я компилирую свое приложение Spring Boot в Java 9, оно перестает работать после пары сообщений, таких как это:

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)

Может кто-нибудь сказать мне, что здесь происходит? Насколько я понимаю, любой код до 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);
}

Так что, если это так с пакетом com.fasterxml.jackson.annotation, то почему ошибка ссылается на модуль с таким именем и почему проблема не в том, что он его не читает?

1 ответ

Решение

Цитирование из JigSaw Spec:

Безымянный модуль экспортирует все свои пакеты. Это обеспечивает гибкую миграцию, как мы увидим ниже. Это, однако, не означает, что код в названном модуле может обращаться к типам в неназванном модуле. Именованный модуль не может даже объявить зависимость от неназванного модуля.

То, что вы ищете, это автоматические модули. В автоматических модулях jar может быть помещен в путь к модулю и автоматически получит имя модуля из jar сам. Если вы используете Maven, это должно быть artifactId,

Таким образом, если вы используете jackson-annotations в Maven следующим образом:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.0.0</version>
</dependency>

Вам все равно потребуется определить его внутри вашего module-info.java:

module example {
    requires jackson.annotations;
}

После этого вы можете свободно использовать аннотации в вашем модуле.

Другие вопросы по тегам