8

java -cp当我通过(不带--add-modulesor )运行应用程序时--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.

4

1 回答 1

9

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

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

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

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

  • 升级模块路径上或系统模块中的每个非 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

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

您的术语在这里略有偏差。在 Java 9 中,如果满足以下两个条件,则模块是可观察的:

  • 模块是系统模块(即来自 JDK)或者它被添加到模块路径
  • 该模块不通过排除--limit-modules

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

我认为您想知道哪些模块是默认的根模块集?在这种情况下,请参见上述根模块的定义。

于 2017-05-18T16:24:09.627 回答