Создание информации модуля для автоматических модулей с jdeps в java 9
У меня есть 3 банки с библиотекой Джексона
- ДЖЕКСОН-ядро-2.8.10.jar
- ДЖЕКСОН-аннотаций-2.8.0.jar
- ДЖЕКСОН-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.