从项目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 documentation指出:
-module-path modulepath ...或-p modulepath
用分号(;)分隔的目录列表,其中每个目录都是模块目录。
但是显然,这还不是全部,而且至少不是Eclipse在此选项下的用法。
注:我见过this question,但实际上并没有帮助:一个回答说module-info.java放在src / java /中,另一个回答说它去一个名称为模块名的目录。显然两者都是正确的,但是它们没有解释原因,并且存在明显的矛盾。
从项目Jigsaw的快速入门教程中,似乎module-info.java转到具有模块名称的目录,例如,对于包含类MyClass的模块my.module:bin / ...] >
摘自java.lang.module.ModuleFinder#of(Path...)
的文档:
返回模块查找器,该查找器通过搜索目录和/或打包的模块序列来在文件系统上定位模块。给定数组中的每个元素都是以下之一: