Java 9 个模块的目录布局

directory layout for Java 9 modules

我一直在尝试编写 Java 9 模块,但无论我做什么,我都会收到错误 "package is empty or does not exist"。我已经尝试在线搜索预期的目录布局,并尝试了我能想到的目录布局的所有变体,但没有任何效果。

例如,这是我尝试过的一种布局

bar.foo/module-info.java

module bar.foo {
    exports bar.foo;
}

bar.foo/bar/foo/wtf.java

package bar.foo;

public class wtf {
}

但是编译还是和往常一样报错

> javac bar.foo/module-info.java 
bar.foo/module-info.java:2: error: package is empty or does not exist: bar.foo
    exports bar.foo;
               ^
1 error

应该起作用的命令是:

javac bar.foo/module-info.java bar.foo/bar/foo/wtf.java

原因是,您正在尝试编译一个 class,它需要一个包存在,即在您的情况下 bar.foo。但是由于您还没有创建,编译器会抛出上述错误。

这与目录布局无关,而是编译器评估的.class。提供您的其他 class(bar.foo/bar/foo/wtf.java) 在该包中创建 wtf.class,因此编译器也会成功编译 module-info.class

我 运行 在尝试将 module-info.java 添加到我没有源代码的 JAR 文件时遇到了同样的问题。我不得不添加一个空的 class bar.foo.Bogus 并用

编译
javac bar.foo/module-info.java bar.foo/bar/foo/Bogus.java

之后您可以删除伪造的 class。