9

我有 3 罐杰克逊图书馆

  1. 杰克逊核心-2.8.10.jar
  2. 杰克逊注释-2.8.0.jar
  3. jackson-databind-2.8.10.jar

我成功地为 core 和 annotation 创建了 module-info.java,并使用 jdeps 将它们转换为 Named maodule。

对于 databind ,我尝试了以下命令:

jdeps --generate-module-info 。--module-path %JAVA_HOME%\jomds;jackson.core;jackson.annotations existingmods\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.

如何为 jackson-databind 生成 module-info.java ?

4

2 回答 2

20

简短的回答是,是的,您必须将库转换为显式模块。

jlink工具旨在提供仅包含所需模块的修剪二进制图像。问题是自动模块可以访问可以读取所有 JDK 模块的类路径(也称为未命名模块)。所以什么都不会被修剪。

该线程也说明了这一点,并带有指向 YouTube 视频的链接。

此示例转换commons-lang3-3.5.jarjlink演示的显式模块。

编辑:更具体地说,这里是一个示例脚本,它按顺序将 、jackson-corejackson-annotations遗留jackson-databindjar 转换为模块化 jar。

这个想法是:

  • jdeps --generate-module-info在遗留 jar 上运行
  • 将遗留的jar解压到一个文件夹中,module-info.java从上面添加,重新编译,然后重新压缩

诀窍是具有依赖关系的模块化 jar 将需要这些依赖关系作为命令行参数。例如,这里是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
于 2017-12-09T11:18:24.857 回答
2

接受的答案描述为不提供它的库创建 Java 9 模块信息(它们被视为自动模块)。

Jackson 从版本 2.10.0 开始,实际上提供了 Java 9 模块信息。

于 2019-10-09T08:19:28.173 回答