在 Maven 项目中,如果两个模块需要互相引用,通常的做法是将它们放在同一个父项目下,并使用父项目的聚合功能来管理这些模块。这样做可以确保模块之间的依赖关系能够正确解析。
项目结构
假设你有两个模块 module-a
和 module-b
,它们需要互相引用。你可以创建一个父项目 parent-project
,并在父项目的 pom.xml
中声明这两个模块。
项目目录结构
parent-project
│
├── module-a
│ └── pom.xml
│
├── module-b
│ └── pom.xml
│
└── pom.xml
父项目的 pom.xml
在父项目的 pom.xml
中,声明这两个模块:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>module-a</module>
<module>module-b</module>
</modules>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
module-a
的 pom.xml
在 module-a
的 pom.xml
中,声明对 module-b
的依赖:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>module-a</artifactId>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>module-b</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
module-b
的 pom.xml
在 module-b
的 pom.xml
中,声明对 module-a
的依赖:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>module-b</artifactId>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>module-a</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
构建项目
- 安装父项目: 在父项目的根目录下运行以下命令,这将安装所有子模块到本地仓库:
mvn clean install
- 构建子模块:
你可以分别在
module-a
和module-b
目录下运行mvn clean install
,或者在父项目的根目录下运行mvn clean install
来构建整个项目。
注意事项
- 循环依赖:虽然 Maven 允许模块之间的相互依赖,但在实际开发中应尽量避免循环依赖。循环依赖可能导致构建失败或难以维护的代码结构。
- 版本管理:确保所有模块的版本一致,使用
${project.version}
可以确保子模块的版本与父项目保持同步。 - 依赖顺序:Maven 会根据模块的依赖关系自动确定构建顺序,但有时需要手动调整模块的构建顺序。