在 Maven 项目中,如果两个模块需要互相引用,通常的做法是将它们放在同一个父项目下,并使用父项目的聚合功能来管理这些模块。这样做可以确保模块之间的依赖关系能够正确解析。

项目结构

假设你有两个模块 module-amodule-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-apom.xml

module-apom.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-bpom.xml

module-bpom.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>

构建项目

  1. 安装父项目: 在父项目的根目录下运行以下命令,这将安装所有子模块到本地仓库:
mvn clean install
  1. 构建子模块: 你可以分别在 module-amodule-b 目录下运行 mvn clean install,或者在父项目的根目录下运行 mvn clean install 来构建整个项目。

注意事项

  1. 循环依赖:虽然 Maven 允许模块之间的相互依赖,但在实际开发中应尽量避免循环依赖。循环依赖可能导致构建失败或难以维护的代码结构。
  2. 版本管理:确保所有模块的版本一致,使用 ${project.version} 可以确保子模块的版本与父项目保持同步。
  3. 依赖顺序:Maven 会根据模块的依赖关系自动确定构建顺序,但有时需要手动调整模块的构建顺序。