【问题标题】:Why Java Automatic modules do not contain exports section为什么 Java 自动模块不包含导出部分
【发布时间】:2018-11-13 22:47:52
【问题描述】:

有一种机制可以将常规 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

如果包com.foo 无论如何都被认为是导出的,为什么没有exports 部分?我觉得这有点令人困惑:--describe-module 表明没有导出包,但同时,main 是一个自动模块,所以所有内容都隐式导出 .

【问题讨论】:

    标签: java-9 java java-9 java-module java-platform-module-system


    【解决方案1】:

    我相信,jar 工具中的命令行选项--describe-module 仅用于描述 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;
    }
    

    【讨论】:

    • for automatic module just the name is depicted. 看起来这不是为自动模块提供的唯一信息。有关于包含的包和所需模块的信息。但不是导出的包。缺少此信息仍然有点令人困惑。非常感谢您的回复。
    • @AntonBalaniuc 您所说的缺少的信息可能是故意省略的,因为自动模块只是迁移的一种途径,而不是任何使用它们的模块化项目的未来要求。因此,在描述它们时列出module-info.class 可能只是告诉消费者的信息太多了,“嘿,我在这里有一个描述符,继续使用它。” ...相反,我将依赖当前的实现并告诉消费者,“我是一个自动模块,你应该关注我的模块化版本更新。”
    • jar 工具的输出是正确的。没有 module-info.class 的模块路径上的 JAR 文件派生的模块的详细信息在 ModuleFinder 规范中。自动模块在编译时和运行时都受到特殊处理,因此它们的工作方式就像所有包都已导出和打开一样。
    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多