在java 9中使用jdeps为自动模块创建module-info

opt*_*nal 6 jar java-9 jdeps java-module

我有3罐杰克逊图书馆

  1. 杰克逊核心2.8.10.jar
  2. 杰克逊的注解 - 2.8.0.jar
  3. 杰克逊 - 数据绑定,2.8.10.jar

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

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

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.
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ter 15

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

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

此主题也说明了这一点,并附有YouTube视频的链接.

此示例转换commons-lang3-3.5.jarjlink演示的explict模块.

编辑:更具体,这里有一个例子脚本转换,从而,jackson-core,jackson-annotations,和jackson-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
Run Code Online (Sandbox Code Playgroud)

  • 我已经用链接到GitHub解决方案的链接更新了答案,该解决方案可以转换所有三个jar。 (2认同)
  • 虽然我制作了所有的 jars moduler 但仍然 jackson.databind 在使用 jdeps 创建 module-info.java 时没有读取 jackson.annotation 模块。 (2认同)