为什么 Java 自动模块不包含导出部分
Why Java Automatic modules do not contain exports section
有一种机制可以将常规 jar 转换为 automatic module starting from java-9,只需将其放置在 modulepath
而不是 classpath
上即可。自动模块具有以下属性:
An automatic module is a named module that is defined implicitly,
since it does not have a module declaration. Every package in an
automatic module is, therefore, considered to be exported even if it
might actually be intended only for internal use.
因此自动模块中的所有包都可用。但是,如果我们使用 --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
如果包 com.foo
无论如何都被认为是导出的,为什么没有 exports
部分?我觉得这有点令人困惑:--describe-module
表明 没有导出包 ,但与此同时,main
是一个自动模块,所以一切都是 隐式导出。
我相信,jar
工具中的命令行选项 --describe-module
只是描述 jar 文件的内容,如果它是一个显式模块,完整的描述符是共享的,而对于自动模块只描述了名字。
引用命令jar --help
Print the module descriptor, or automatic module name
另一方面,如果您 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;
}
有一种机制可以将常规 jar 转换为 automatic module starting from java-9,只需将其放置在 modulepath
而不是 classpath
上即可。自动模块具有以下属性:
An automatic module is a named module that is defined implicitly, since it does not have a module declaration. Every package in an automatic module is, therefore, considered to be exported even if it might actually be intended only for internal use.
因此自动模块中的所有包都可用。但是,如果我们使用 --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
如果包 com.foo
无论如何都被认为是导出的,为什么没有 exports
部分?我觉得这有点令人困惑:--describe-module
表明 没有导出包 ,但与此同时,main
是一个自动模块,所以一切都是 隐式导出。
我相信,jar
工具中的命令行选项 --describe-module
只是描述 jar 文件的内容,如果它是一个显式模块,完整的描述符是共享的,而对于自动模块只描述了名字。
引用命令jar --help
Print the module descriptor, or automatic module name
另一方面,如果您 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;
}