为什么 Java 自动模块不包含导出部分

Why Java Automatic modules do not contain exports section

有一种机制可以将常规 jar 转换为 automatic module starting from ,只需将其放置在 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;
}