猿问

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

有一种机制可以将常规 jar 转换为自动模块,从java-9, 通过简单地将其放置到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它是一个自动模块,因此所有内容都是隐式导出的。


幕布斯7119047
浏览 212回答 1
1回答

慕沐林林

我相信,工具中的命令行选项--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;}
随时随地看视频慕课网APP

相关分类

Java
我要回答