Создание информации модуля для автоматических модулей с jdeps в java 9

У меня есть 3 банки с библиотекой Джексона

  1. ДЖЕКСОН-ядро-2.8.10.jar
  2. ДЖЕКСОН-аннотаций-2.8.0.jar
  3. ДЖЕКСОН-DataBind-2.8.10.jar

Я успешно создал module-info.java для ядра и аннотаций и преобразовал их в именованный модуль с помощью jdeps.

для привязки данных я попробовал следующую команду:

jdeps --generate-module-info. --module-path% JAVA_HOME% \ jomds; jackson.core; jackson.annotations существующие mods\jackson-databind-2.8.10.jar

Теперь происходит следующая ошибка:

Missing dependence: .\jackson.databind\module-info.java not generated
Error: missing dependencies
   com.fasterxml.jackson.databind.AnnotationIntrospector -> com.fasterxml.jackson.annotation.JsonCreator       not found
   com.fasterxml.jackson.databind.AnnotationIntrospector -> com.fasterxml.jackson.annotation.JsonCreator$Mode  not found
   com.fasterxml.jackson.databind.AnnotationIntrospector -> com.fasterxml.jackson.annotation.JsonFormat        not found
   com.fasterxml.jackson.databind.AnnotationIntrospector -> com.fasterxml.jackson.annotation.JsonFormat$Value  not found
   com.fasterxml.jackson.databind.AnnotationIntrospector -> com.fasterxml.jackson.annotation.JsonIgnoreProperties not found
   com.fasterxml.jackson.databind.AnnotationIntrospector -> com.fasterxml.jackson.annotation.JsonIgnoreProperties$Value not found.

Как я могу сгенерировать module-info.java для jackson-databind?

1 ответ

Решение

Короткий ответ: да, вам придется конвертировать библиотеки в явные модули.

jlink Инструмент предназначен для предоставления обрезанного двоичного изображения, имеющего только необходимые модули. Проблема заключается в том, что автоматические модули имеют доступ к classpath (он же безымянный модуль), который может читать все модули JDK. Так что ничего не будет урезано.

В этой теме также говорится о ссылке на видео на YouTube.

Этот пример конвертирует commons-lang3-3.5.jar в модуль экспликации для jlink демо.

Изменить: чтобы быть более конкретным, вот пример сценария, который преобразует, по порядку, jackson-core, jackson-annotations, а также jackson-databind устаревшие банки в модульные банки.

Идея заключается в следующем:

  • бежать jdeps --generate-module-info на старой банке
  • разархивируйте устаревшую банку в папку, добавьте module-info.java сверху, заново скомпилируйте и заново заархивируйте

Хитрость заключается в том, что модульные фляги с зависимостями будут требовать этих зависимостей в качестве параметров командной строки. Например, вот jackson-databind (несколько абстрагировано):

# here, jackson-core and jackson-annotations have been built
# jackson-databind 

jdeps --module-path $ROOT_DIR/modules \
--add-modules jackson.annotations,jackson.core \
--generate-module-info work $JACKSON_DATABIND_JAR

javac --module-path $ROOT_DIR/modules \
--add-modules jackson.annotations,jackson.core \
-d $ROOT_DIR/classes module-info.java

В принятом ответе описывается создание информации о модуле Java 9 для библиотек, которые ее не предоставляют (они рассматриваются как автоматические модули).

Джексон, начиная с версии 2.10.0, фактически предоставляет информацию о модулях Java 9.

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