Maven 项目拆分与聚合实战:分层架构下的多模块开发

引入:

在大型 Java 项目开发中,Maven 多模块管理是解耦代码、提升可维护性的核心手段。本文将以"用户管理系统"为例,详解 Maven 项目的拆分、聚合流程,以及分层架构下各模块的职责与代码实现。

一、Maven 核心概念:坐标与依赖

Maven 项目的核心是坐标,通过 `groupId`、`artifactId`、`version` 唯一标识一个项目,用于依赖管理:

依赖通过坐标引入,例如在 `maven-service` 中引入 `maven-dao`:

XML 复制代码
<dependency>
            <groupId>com.qcby</groupId>
            <artifactId>maven_dao</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
</dependency>

二、项目拆分:按分层架构拆分模块

  • 分支图:
  • 父项如下图:

大型项目通常按分层架构拆分模块,每个模块承担单一职责。以"用户管理系统"为例,拆分出以下模块:

模块名 职责 对应架构层
maven_pojo 实体类(POJO) 模型层
maven-dao 数据访问(数据库操作) 数据访问层(DAO)
maven-service 业务逻辑处理 业务逻辑层(Service)
maven-control 前端交互(Servlet/Controller) 表现层

2.1 拆分步骤

  1. 创建父项目(`maven_parent09`),统一管理依赖版本、插件等;
  2. 基于父项目创建子模块(maven_pojo、maven-dao、maven-service、maven-control);
  3. 配置模块间的依赖(如maven_control依赖maven_service; maven_service依赖 maven_dao,maven_dao 依赖 maven_pojo)。

三、各模块代码实现

3.1 `maven_pojo`:实体类模块

3.1.1java实现

  • 定义用户实体类 `User`:
java 复制代码
package com.qcby;
//pojo做数据传递
public class User {
    private int id;
    private String name;
    private int age;
    private String sex;
    private String phone;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

3.1.2该模块下的pom.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>maven_parent09</artifactId>
        <groupId>com.qcby</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven_pojo</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

3.2 `maven_dao`:数据访问模块

3.2.1java实现

java 复制代码
package com.qcby;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class UserDao {
    //将这里换成jdbc
//要添加mysql的依赖
    public static List<User> search() {
        List<User> users=new ArrayList<>();
        System.out.println("dao层查询数据库信息");
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");//加载驱动
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/0910demo",
                    "root", "2020");//连接数据库
            String sql = "select * from student";
            ResultSet set = connection.createStatement().executeQuery(sql);//将查询结果封装在set
            while (set.next()) {//每次创建一个对象,将数据封装在users
                User user=new User();
                user.setId(set.getInt("id"));
                user.setName(set.getString("name"));
                user.setSex(set.getString("sex"));
                user.setAge(set.getInt("age"));
                user.setPhone(set.getString("phone"));
                users.add(user);
            }
            set.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return users;
    }
}

3.2.2该模块下的pom.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>maven_parent09</artifactId>
        <groupId>com.qcby</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven_dao</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.31</version>
        </dependency>
        <dependency>
            <groupId>com.qcby</groupId>
            <artifactId>maven_pojo</artifactId>
            <version>1.0-SNAPSHOT</version>

        </dependency>
    </dependencies>
</project>

3.3 `maven_service`:业务逻辑模块

3.3.1java实现

java 复制代码
package com.qcby;

import java.util.List;

public class UserService {
    public static List<User> GetUserService(){
       List<User> users= UserDao.search();
       for(User user:users){
System.out.println(user.toString());
       }
       return users;

       }

}

3.3.2该模块下的pom.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>maven_parent09</artifactId>
        <groupId>com.qcby</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven_service</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.qcby</groupId>
            <artifactId>maven_dao</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

3.4 `maven_control`:表现层模块

3.4.1java实现

负责前端交互(以 Servlet 为例)

java 复制代码
package com.qcby;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/user")
public class UserController extends HttpServlet {//添加对servlet的依赖
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("controller层");
        List<User> users=UserService.GetUserService();
        for(User user:users){
            System.out.println("--->controller--->"+user.toString());
        }
        //写回到前端页面
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("application/json");
        resp.getWriter().write(String.valueOf(users));
    }
}

3.4.2该模块下的pom.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<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">
    <parent>
        <artifactId>maven_parent09</artifactId>
        <groupId>com.qcby</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven_control</artifactId>
    <packaging>war</packaging>


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.qcby</groupId>
            <artifactId>maven_service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>


</project>

四、Maven 多模块开发的优势

  1. 职责单一:每个模块只做一件事,代码解耦,便于维护;
  2. 复用性高:`maven_pojo`、`maven-dao` 可被多个项目复用;
  3. 版本统一:父项目统一管理依赖版本,避免版本冲突;
  4. 构建高效:聚合项目可一键构建所有模块,按依赖顺序自动执行。

五、总结

Maven 多模块开发是大型 Java 项目的标准实践,核心流程是:

  1. 拆分:按分层架构拆分模块,每个模块承担单一职责;
  2. 依赖:通过 Maven 坐标配置模块间的依赖;
  3. 构建:一键构建整个项目,按依赖顺序执行。

掌握 Maven 多模块开发,能帮助你应对大型项目的代码管理与协作问题,是后端开发工程师的必备技能。

相关推荐
彭于晏Yan10 分钟前
OkHttp 与 RestTemplate 技术选型对比
java·spring boot·后端·okhttp
豆豆16 分钟前
WordPress与PageAdmin CMS深度技术对比:从架构到国产化合规的全维度分析
架构·cms·网站建设·建站系统·内容管理系统·网站管理系统·站群cms
金銀銅鐵20 分钟前
[Java] 如何理解 class 文件中字段的 descriptor?
java·后端
5008424 分钟前
Graph Engine 是什么,为什么需要它
java·人工智能·性能优化·ocr·wpf
未若君雅裁28 分钟前
服务雪崩、降级、熔断与服务保护
java·微服务
就叫_这个吧1 小时前
Java实现线程间的通讯--使用synchronized关键字和JUC方式实现
java·开发语言
学习中.........1 小时前
JVM 垃圾回收核心技术、演进全景与生产调优规范
java·jvm·测试工具
小小编程路1 小时前
C++类作用域
java·jvm·c++
小辰记事本1 小时前
从零读懂网卡内部架构:一条数据包的硬件之旅
网络·网络协议·架构·rdma
维构lbs智能定位1 小时前
人员定位系统技术方案:从系统功能架构、解决方案到选型标准
架构·人员定位系统·人员定位系统技术方案