在 java 9 中使用 jdeps 为自动模块创建模块信息
creating module-info for automatic modules with jdeps in java 9
我有 3 jar jackson 库
- jackson-core-2.8.10.jar
- jackson-annotations-2.8.0.jar
- 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 example 将 commons-lang3-3.5.jar
转换为 jlink
演示的显式模块。
Edit:更具体地说,here is an example 脚本按顺序转换 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
接受的答案描述了为不提供它的库创建 Java 9 个模块信息(它们被视为自动模块)。
Jackson,从2.10.0版本开始,居然提供了Java9个模块信息
我有 3 jar jackson 库
- jackson-core-2.8.10.jar
- jackson-annotations-2.8.0.jar
- 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 example 将 commons-lang3-3.5.jar
转换为 jlink
演示的显式模块。
Edit:更具体地说,here is an example 脚本按顺序转换 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
接受的答案描述了为不提供它的库创建 Java 9 个模块信息(它们被视为自动模块)。
Jackson,从2.10.0版本开始,居然提供了Java9个模块信息