为什么Java自动模块不包含打开部分

时间:2018-11-13 22:47:53

标签: java java-9 java-module jigsaw

有一种机制可以将常规jar从automatic module转换为,方法是将其简单地放在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是一个自动模块,因此所有内容都是隐式导出的

1 个答案:

答案 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;
}