Java9 中导出、间接导出、需求和间接需求之间的区别?

Difference between Exports, Indirect Exports, Requires and Indirect Requires in Java9?

我正在查看 jdk.accessibility 的 API 文档并注意到它单独列出了所有这些。

  1. 一个模块中作用域为requires的模块都是消费模块的Indirect Requires?

  2. 模块的module-info.java如下:

    module jdk.accessibility {
        requires transitive java.desktop;
    
        exports com.sun.java.accessibility.util;
    }
    

    并且对于 java.desktop 是这样的(试图包括不同的 -

    module java.desktop {
        ...
        requires java.prefs;
        ...
        requires transitive java.xml;
        exports java.applet;
        ...
        exports sun.awt to
            javafx.swing,
            jdk.accessibility,
            oracle.desktop;
        opens javax.swing.plaf.basic to jdk.jconsole;
        ...
        uses javax.sound.sampled.spi.MixerProvider;
        ...
        provides javax.sound.sampled.spi.MixerProvider with
            com.sun.media.sound.DirectAudioDeviceProvider,
            com.sun.media.sound.PortMixerProvider;
    

    但是 jdk.accessibility 的文档没有提及 sun.awt 作为 Requires 或 Indirect Requires 或 Indirect Exports。这里不一致的原因是什么?

寻找这些差异的示例,以帮助理解 (2) 中发生的事情,以及我们在适应模块结构时应遵循的做法Java9.

请注意:

module java.desktop {
    ...
    ...
    exports sun.awt to
        javafx.swing,
        jdk.accessibility,
        oracle.desktop;
}

sun.awt 是一个包,不是模块名。 (Here 是另一个例子。)因此,文档中不会提及 sun.awt 是有道理的,因为 java.desktop 已被引用。

编辑: 另外请注意,对于 jdk.accessibility 模块的客户端,无法访问 sun.awt 包。也就是说,它由 java.desktop 导出供 jdk.accessibility 使用,但不会成为其 API 的一部分。我已经确认 (example here) 这是真的,即使 jdk.accessibility 需要 java.desktop 作为 transitive