【问题标题】:Difference between Exports, Indirect Exports, Requires and Indirect Requires in Java9?Java9中的Exports、Indirect Exports、Requires和Indirect Requires之间的区别?
【发布时间】:2018-02-02 09:20:50
【问题描述】:

我浏览了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 作为要求或间接要求或间接导出。这里不一致的原因是什么?

寻找可以帮助理解(2)中发生的情况以及我们应遵循哪些实践以适应使用Java9的模块结构的这些区别的示例。

【问题讨论】:

    标签: java java-9 java-platform-module-system access-specifier


    【解决方案1】:

    注意在:

    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

    【讨论】:

    • 我的意思是没有提到作为一个包。 download.java.net/java/jdk9/docs/api/…
    • 我已经用信息更新了答案,因为我理解了这个问题。如果模块 A“将 sun.awt 导出到 B”,则 B 的客户端无法看到“sun.awt”,即使 B 确实在 A 上“需要传递”。
    猜你喜欢
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2013-04-29
    相关资源
    最近更新 更多