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

Which system modules are on the module path by default?

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

例如,所有 java.se 模块都是可观察的。所有 java.se.ee 个模块都不可观察。我知道 javafx.* 模块是可观察的。 jdk.unsupportedjdk.shell 也是可见的。

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

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

So, is my assumption correct: if no --add-modules and --limit-modules are specified, the set of observable system modules consists of all system modules except java.se.ee?

简而言之,没错。

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

  • The java.se module is a root, if it exists. If it does not exist then every java.* module on the upgrade module path or among the system modules that exports at least one package, without qualification, is a root.

  • Every non-java.* module on the upgrade module path or among the system modules that exports at least one package, without qualification, is also a root.

这是 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

Is there a reliable way to know the exact list of default observable system modules? I know there is a --list-modules option, but it lists all modules including java.se.ee.

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

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

这意味着 java.se.ee 默认是 可观察的

我想您反而想知道 哪些模块是 根模块 的默认设置?在这种情况下,请参阅上面的根模块定义。