为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯7119047 2022-01-19 16:58:46
有一种机制可以将常规 jar 转换为自动模块,从java-9, 通过简单地将其放置到modulepath而不是classpath. 自动模块具有以下属性:自动模块是隐式定义的命名模块,因为它没有模块声明。因此,自动模块中的每个包都被视为已导出,即使它实际上可能仅用于内部使用。因此,自动模块内的所有包都可用。但是,如果我们使用指令检查自动模块,则输出--describe-module中没有exports部分。例如一个自动模块 mainjar --file main.jar --describe-modulecom.foo jar:file:///.../code/module/main.jar/!module-info.classrequires java.base mandatedcontains com.foo如果无论如何都认为包被导出,为什么没有exports部分?com.foo我觉得这有点令人困惑:--describe-module表明没有导出的包,但同时,main它是一个自动模块,因此所有内容都是隐式导出的。
查看完整描述

1 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

我相信,工具中的命令行选项--describe-module只是jar描述 jar 文件的内容,如果它是一个显式模块,则共享完整的描述符,而对于自动模块,只描述名称。


从命令中引用 jar --help


打印模块描述符或自动模块名称


另一方面,如果您尝试使用给定 jar 文件jdeps来生成module-info.java自动模块,您会注意到此类包导出实际上存在于模块声明中。比如说:


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;

}


查看完整回答
反对 回复 2022-01-19
  • 1 回答
  • 0 关注
  • 211 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信