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

时间:2017-12-09 11:02:30

标签: jar java-9 java-module jdeps

我有3罐杰克逊库

  1. 杰克逊 - 芯 - 2.8.10.jar
  2. jackson-annotations-2.8.0.jar
  3. 杰克逊 - 数据绑定-2.8.10.jar
  4. 我成功地为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.
    

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

2 个答案:

答案 0 :(得分:13)

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

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

This thread也说明了这一点,并附有YouTube视频的链接。

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

修改:更具体的here is an example脚本,按顺序将jackson-corejackson-annotationsjackson-databind旧版jar转换为模块化罐子。

这个想法是:

  • 在传统jar上运行jdeps --generate-module-info
  • 将旧版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

答案 1 :(得分:0)

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

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