从项目Jigsaw的快速入门教程中,似乎 module-info.java 进入了具有模块名称的目录,例如,对于包含类 MyClass 的模块 my.module:
bin/
my.module/
module-info.class
my/
module/
MyClass.class
然后,仍然按照教程,在调用 MyClass 时(假设它有一个method
),模块路径选项被赋予bin
目录:
java -p path/to/bin -m my.module/my.module.MyClass
到目前为止,一切都很好。
但是,如果我写它也可以:
java -p path/to/bin/my.module -m my.module/my.module.MyClass
而且我不明白为什么两者都有效。
如果bin
包含两个模块,则没有区别:如果两个目录都在模块路径中,则第二个版本仍然有效(如果仅bin
在模块路径中,它也有效,如教程中所述)。
现在,当我尝试使用 Java 9 模块使用 Eclipse 创建 Maven 项目时,module-info.java 位于src/man/java
目录中,同样 module-info.class 位于target/classes
. 所以现在包含 module-info.class 文件的目录与模块的名称没有关系。
并且target/classes
也在模块路径中(当我检查构建配置时)。这类似于上面的第二种情况,使用java -p path/to/bin/my.module -m my.module/my.module.MyClass
. 那么,显然,Java 仅使用 module-info.class 的内容来发现模块名称,而目录名称是任意的?
但是,在第一种情况下,当我写 时java -p path/to/bin -m my.module/my.module.MyClass
,这意味着 Java 将在模块路径中的目录中查找目录。
我觉得我错过了一些重要的东西。Java 在模块路径中的目录中查找模块的方式是否有明确的解释?什么真正指定了一个模块?(我的印象是:不是目录,只有module-info.java)。
让我更加困惑的是:Oracle 文档指出:
--module-path 模块路径... 或 -p 模块路径
分号 (;) 分隔的目录列表,其中每个目录都是模块目录。
但显然这不是全部,至少不是 Eclipse 使用此选项的方式。
注意:我见过这个问题,但它并没有真正帮助:一个答案说 module-info.java 进入 src/java/,另一个说它进入一个名为模块名称的目录。显然两者都是正确的,但他们没有解释原因,并且存在明显的矛盾。