我正在尝试编译一个 Java 模块,该模块位于与我的项目源根目录不同的目录中。这是我的项目结构:
Foundation-Test-1:
│ .gitignore
│ Foundation-Test-1.iml
│
├───MyFirstModule
│ │ MyFirstModule.iml
│ │
│ └───src
│ │ module-info.java
│ │
│ └───modular
│ HelloWorld.java
│
├───out
│ └───production
│ └───MyFirstModule
│ │ module-info.class
│ │
│ └───modular
│ HelloWorld.class
│
└───src
我的module-info.java内容:
module MyFirstModule {
exports modular;
}
当我尝试使用以下命令进行编译时:
我收到错误:
error: module MyFirstModule not found in module source path
我在 StackOverflow 上阅读了类似的模块相关问题,但仍然无法解决我的具体问题。
注意以下所有命令均假设
Foundation-Test-1
是工作目录。
要了解
javac
的工作原理,我建议阅读其工具规范。特别是,阅读目录层次结构和模块源路径选项部分将有助于理解如何编译模块。在您的情况下,以下命令应该有效:
javac -d out/production --module-source-path MyFirstModule=MyFirstModule/src --module MyFirstModule
上面在指定
--module-source-path
选项时使用了所谓的“模块特定形式”,它直接告诉编译器哪个目录包含MyFirstModule
模块。有关更多信息,请参阅前面链接的工具规范的模块源路径部分。
您的另一个选择是将
module-info.java
文件向上移动一个级别,这样您就可以:
Foundation-Test-1
|
\---MyFirstModule
| module-info.java
|
\---src
\---modular
HelloWorld.java
注意
module-info.java
直接位于 MyFirstModule/
目录下 而不是 位于 src/
目录下。进行此更改后,您应该能够执行:
javac -d out/production --module-source-path . --module MyFirstModule
这是可行的,因为现在名为
module-info
的模块的 MyFirstModule
描述符是直接位于同名目录下。有关更多信息,请参阅前面链接的工具规范的目录层次结构部分的模块源层次结构小节。
您可以使用的另一种方法是以“旧方式”编译代码:
javac -d out/productions --source-path MyFirstModule/src <sources>
其中
<sources>
替换为您要编译的源文件列表。这就是编译非模块化源代码的方式,但如果您在源列表中包含 module-info.java
文件,那么它也将被编译(并验证)。请注意,如果您有很多源文件需要编译,那么您可能希望使用参数文件来列出它们。您可能希望使用命令行工具来查找所有 *.java
文件,而不是手动列出它们。