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

9

我有三个 jackson 库的 jar 包

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

我已经成功创建了 core 和 annotation 的 module-info.java 文件,并使用 jdeps 将它们转换为 Named 模块。

对于 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文件?

1
可能是is-there-a-way-to-add-maven-dependencies-while-using-the-maven-jlink-plugin的重复问题?在其他问题中将maven视为框架并不是导致失败的原因。 - Naman
2个回答

22
短答案是,是的,你需要将库转换为显式模块。 jlink 工具旨在提供一个仅包含所需模块的修剪二进制图像。问题在于,自动模块可以访问类路径(也称为未命名模块),该模块可以读取所有 JDK 模块。因此,没有任何东西会被修剪。 这个线程 也陈述了这一点,并链接到一个 YouTube 视频。 这个示例commons-lang3-3.5.jar 转换为 jlink 演示的显式模块。 编辑: 更具体地说,这里有一个示例 脚本,按顺序将遗留 jar 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

2
我已经更新了答案,并附上了一个GitHub解决方案的链接,可以将所有三个jar文件转换。 - Michael Easter
2
虽然我让所有的Jars都成为了模块,但是在使用jdeps创建module-info.java时,jackson.databind仍未读取jackson.annotation模块。 - optional
我正在手动将 requires transitive jackson.annotations 添加到 module-info.java 中,以便于 jackson.databind。 - optional
1
重新编译是不必要的。您可以将模块声明注入到JAR中。 - ZhekaKozlov

3

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接