默认情况下,哪些系统模块在模块路径上?

Zhe*_*lov 7 java java-platform-module-system java-9 module-path

当我通过java -cp(没有--add-modules--limit-modules)运行应用程序时,某些Java系统模块是可观察的,而其他的则不是.

例如,所有java.se模块都是可观察的.所有java.se.ee模块都无法观察到.我知道javafx.*模块是可观察的.jdk.unsupported并且jdk.shell也是可观察的.

所以,我的假设是正确的:如果没有--add-modules并且--limit-modules被指定,那么可观察的系统模块集包括所有系统模块,除了java.se.ee

有没有可靠的方法来了解默认的可观察系统模块的确切列表?我知道有一个--list-modules选项,但它列出了所有模块,包括java.se.ee.

And*_*ert 7

所以,我的假设是正确的:如果没有指定--add-modules和--limit-modules,那么可观察的系统模块集包含除java.se.ee之外的所有系统模块?

简而言之,是的,这是正确的.

Java 9中启用的默认模块集称为根模块.根据JEP 261,默认的根模块集定义为:

  • java.se模块是root用户(如果存在).如果它不存在则升级模块路径上或导出至少一个包的系统模块中的每个java.*模块都是root用户.

  • 升级模块路径上或导出至少一个包的系统模块中的每个非java.*模块都没有限定条件,也是根.

这是java.se模块中包含的内容的漂亮图形: 在此输入图像描述 (来源:Java 9 javadoc)

java.se聚合模块一样,java.se.ee模块本身不提供任何类,它是一个包含以下模块的聚合模块:

java.se
java.activation
java.annotations.common
java.corba
java.transaction
java.xml.bind
java.xml.ws
Run Code Online (Sandbox Code Playgroud)

有没有可靠的方法来了解默认的可观察系统模块的确切列表?我知道有一个--list-modules选项,但它列出了所有模块,包括java.se.ee.

你的术语稍微偏离了这里.在Java 9中,如果满足以下两个条件,则可以观察到模块:

  • 模块是一个系统模块(即来自JDK)或者它被添加到模块路径中
  • 该模块不会被排除在外 --limit-modules

这意味着默认情况下java.se.ee可观察的.

我想你不知道哪些模块是默认的根模块集?在这种情况下,请参阅上面的根模块定义.

  • 好的,`Unsafe`类在`jdk.unsupported`模块中,这是`java.corba`,`java.xml.bind`和`java.xml.ws`模块所需要的,所以我认为它只有在添加其中一个模块时才会被拉入.现在我正在重新阅读JEP 261,我错过了这一部分:_".升级模块路径上或导出至少一个包的系统模块中的每个非java.*模块,无需资格,也是root."_这意味着`jdk.unsupported`默认情况下也是一个根模块.现在更新我的答案 (2认同)