Java9中的Exports、Indirect Exports、Requires和Indirect Requires之间的区别?

Posted

技术标签:

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

我浏览了jdk.accessibility 的 API 文档,发现它单独列出了所有这些。

    一个模块中范围为requires的模块都是消费模块的Indirect Requires

    模块的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的模块结构的这些区别的示例。

【问题讨论】:

【参考方案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 上“需要传递”。

以上是关于Java9中的Exports、Indirect Exports、Requires和Indirect Requires之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

Excel基础(18)Indirect函数

java9 新特征

Indirect函数(Excel函数集团)

从 module.exports 中的另一个函数调用 module.exports 中的“本地”函数?

excel里indirect函数出错

如何解决java9中的模块读取包错误