我在同一个文件夹中有 2 个不同的项目:
com.jdojo.address
和 com.jdojo.person
。第一个有一个简单的 pojo 类 Address
和默认包下的 module-info.java
:
module com.jdojo.address {
exports com.jdojo.address;
}
这里没有错误。
在
com.jdojo.person
项目中,我有一个 Person
类,它使用前一个类中的 Address
属性。 module-info.java
:
module com.jdojo.person {
requires com.jdojo.address;
exports com.jdojo.person;
}
我的
requires
行有一个错误:
找不到模块:com.jdojo.address
我在 NetBeans IDE Dev(内部版本 201708030001) 和 IntelliJ IDEA 2017.2.1 都遇到此问题。
├───com.jdojo.address
│ ├───.idea
│ │ └───inspectionProfiles
│ ├───nbproject
│ │ └───private
│ └───src
│ └───com
│ └───jdojo
│ └───address
├───com.jdojo.intro
│ ├───.idea
│ │ ├───inspectionProfiles
│ │ └───libraries
│ ├───build
│ │ ├───classes
│ │ │ └───com
│ │ │ └───jdojo
│ │ │ ├───address
│ │ │ ├───intro
│ │ │ └───person
│ │ ├───empty
│ │ └───generated-sources
│ │ └───ap-source-output
│ ├───dist
│ ├───nbproject
│ │ └───private
│ ├───src
│ │ └───com
│ │ └───jdojo
│ │ └───intro
│ └───test
├───com.jdojo.person
│ ├───.idea
│ │ └───inspectionProfiles
│ ├───nbproject
│ │ └───private
│ ├───src
│ │ └───com
│ │ └───jdojo
│ │ └───person
│ └───test
├───lib
├───mods
│ └───com.jdojo.intro
│ └───com
│ └───jdojo
│ └───intro
└───src
└───com.jdojo.intro
└───com
└───jdojo
└───intro
这些是模块信息和 java 类路径
C:\Java9Revealed\com.jdojo.address\src\module-info.java
C:\Java9Revealed\com.jdojo.address\src\com\jdojo\address\Address.java
C:\Java9Revealed\com.jdojo.person\src\module-info.java
C:\Java9Revealed\com.jdojo.person\src\com\jdojo\person\Person.java
根据“快速入门指南”,惯例是将源代码放在以模块命名的文件夹中。在这种情况下,文件夹结构应该是:
com.jdojo.address/src/com.jdojo.address/module-info.java
com.jdojo.address/src/com.jdojo.address/com/jdojo/address/Address.java
com.jdojo.person/src/com.jdojo.person/module-info.java
com.jdojo.person/src/com.jdojo.person/com/jdojo/person/Person.java
使用独立于任何 IDE 的命令行工具进行实验很有启发性。我已经在
here说明了这个案例。
module-info.java
的放置
module-info.java
的位置以及命名。我正在将一个多模块 Maven 项目从 Java 11 迁移到 Java 17。在 Java 11 中,该项目会正确构建,直到您添加
module-info.java
文件。然后您可能会发现不同类型的错误,从“X 模块不可见”到“JavaDoc:没有模块 Y 的源”我用
module-info.java
自动生成了
jdeps
文件。这意味着java模块是以maven项目模块命名的,与任何java包名称都不重合。将模块声明重命名为实际的 java 包,是第一步。
然后我尝试根据此处的答案来跟踪
module-info.java
文件的放置位置,但最后,每个 Maven 模块有一个 java 模块,足以将
module-info.java
放置在
src/main/java
目录中,就在其中
com/company/application
开始于像
com.company.application.api
这样的模块(而不是源所在的位置,正如我在几个地方被告知的那样)。所以,不是
src/main/java/com/company/application/api/module-info.java
src/main/java/module-info.java
),对于这样的
module-info.java
:
module api {
exports com.company.application.api;
}