2

所以我知道,在 Java 9 模块(Project Jigsaw)中,不允许拆分包。也就是说,以下模块不能既导出具有相同名称的包,也不能在运行时同时使用:

模块 1

module com.example.foo {
    exports com.example.foo;
}

模块 2

module com.example.foo {
    exports com.example.foo;
}

不允许(或者,至少,它们不能同时运行)。但我不清楚子包是如何发挥作用的。如果一个模块导出包com.example.foo,是否可以导出另一个包com.example.foo.bar?例如,我想做以下事情:

模块 1

module com.example.foo {
    exports com.example.foo;
    exports com.example.foo.exceptions;
    exports com.example.foo.util;
}

模块 2

module com.example.foo.impl1 {
    requires com.example.foo;
    exports com.example.foo.impl1;
}

模块 3

module com.example.foo.impl2 {
    requires com.example.foo;
    exports com.example.foo.impl2;
}

这是允许的吗?所有三个模块都可以在运行时一起使用吗?com.example.foo或者模块导出这一事实是否会com.example.foo阻止另一个模块 ( com.example.foo.impl1) 导出具有子包名称 ( com.example.foo.impl1) 的包?

4

1 回答 1

2

在@RoddyoftheFrozenPeas 的建议下,我创建了一个多模块示例项目来演示此处的行为。tl;博士是它的工作原理!你确实可以这样做。为了证明我也正确地使用了模块,我尝试了第一件事,但我知道它不起作用,我确实遇到了阻止它运行的错误。

我创建了这个 GitHub gist,你可以在其中看到完整的源代码(我永远不会删除它),它显示了我是如何设置项目的。gist 文件名中的下划线表示目录(不能使用斜杠)。该项目布置如下:

- root
  - com-example-foo
    - src
      - module-info.java
      - com
        - example
          - foo
            - SalutationProvider.java
  - com-example-foo-impl1
    - src
      - module-info.java
      - com
        - example
          - foo
            - implone
              - StandardOutHelloer.java
  - com-example-foo-impl2
    - src
      - module-info.java
      - com
        - example
          - foo
            - impltwo
              - StandardErrHelloer.java

它编译得很好,然后这是运行它的结果:

$ java -Dfile.encoding=UTF-8 -p out/production/com-example-foo-impl1:out/production/com-example-foo -m com.example.foo.implone/com.example.foo.implone.StandardOutHelloer
Hello, World!

$ echo $?
0

$ java -Dfile.encoding=UTF-8 -p out/production/com-example-foo-impl2:out/production/com-example-foo -m com.example.foo.impltwo/com.example.foo.impltwo.StandardErrHelloer
Hello, World!

$ echo $?
15

我相信这应该是链接重复问题的答案,因为现有答案只是说“没有子包之类的东西”,而没有提供任何工作示例或文档说明这是明确允许的。但是,由于链接的重复问题本身被标记为与子包无关的问题的重复,因此我无法在此处发布此答案(这是一个封闭的问题)。因此,我将其发布在这里。

于 2019-01-25T19:57:55.127 回答