有一种机制可以将常规jar从automatic module转换为java-9,方法是将其简单地放在modulepath
而不是classpath
上。自动模块具有以下属性:
自动模块是隐式定义的命名模块, 因为它没有模块声明。每个包装中的 因此,即使自动模块也被视为已导出 实际上可能仅供内部使用。
因此,自动模块内的所有软件包均可用。但是,如果我们使用--describe-module
指令检查自动模块,则输出中将没有exports
部分。
例如自动模块main
jar --file main.jar --describe-module
com.foo jar:file:///.../code/module/main.jar/!module-info.class
requires java.base mandated
contains com.foo
如果认为软件包exports
仍被导出,为什么没有com.foo
节?我觉得这有点令人困惑:--describe-module
表示没有没有导出的软件包,但是同时,main
是一个自动模块,因此所有内容都是隐式导出的。
答案 0 :(得分:3)
我相信,--describe-module
工具中的命令行选项jar
仅用于描述jar文件的内容,如果它是一个显式模块,则完整的描述符将与自动模块共享。名称被描绘。
从命令jar --help
引用
打印模块描述符, 或 自动模块名称
反之,如果您try using jdeps
for generating module-info.java
在给定jar文件的情况下使用自动模块,则可能会注意到模块声明中实际上存在此类软件包导出。例如说:
jdeps -verbose:class --generate-module-info ../Desktop ~/.m2/repository/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar
将以下内容写入.../Desktop/org.apache.commons.lang3/module-info.java
module org.apache.commons.lang3 {
requires transitive java.desktop;
exports org.apache.commons.lang3;
exports org.apache.commons.lang3.arch;
exports org.apache.commons.lang3.builder;
exports org.apache.commons.lang3.concurrent;
exports org.apache.commons.lang3.event;
exports org.apache.commons.lang3.exception;
exports org.apache.commons.lang3.math;
exports org.apache.commons.lang3.mutable;
exports org.apache.commons.lang3.reflect;
exports org.apache.commons.lang3.text;
exports org.apache.commons.lang3.text.translate;
exports org.apache.commons.lang3.time;
exports org.apache.commons.lang3.tuple;
}