在 java 9 中使用 jdeps 为自动模块创建模块信息

creating module-info for automatic modules with jdeps in java 9

我有 3 jar jackson 库

  1. jackson-core-2.8.10.jar
  2. jackson-annotations-2.8.0.jar
  3. jackson-databind-2.8.10.jar

我成功地为核心和注释创建了模块-info.java,并使用 jdeps 将它们转换为命名模块。

对于数据绑定,我尝试了以下命令:

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 生成模块-info.java?

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

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

This thread 也说明了这一点,link YouTube 视频。

This examplecommons-lang3-3.5.jar 转换为 jlink 演示的显式模块。

Edit:更具体地说,here is an example 脚本按顺序转换 jackson-corejackson-annotationsjackson-databind 遗留罐子到模块化罐子。

想法是:

  • 运行 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

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

Jackson,从2.10.0版本开始,居然提供了Java9个模块信息