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 多模块开发,能帮助你应对大型项目的代码管理与协作问题,是后端开发工程师的必备技能。

相关推荐
一起养小猫2 小时前
LeetCode100天Day4-盛最多水的容器与两数之和II
java·数据结构·算法·leetcode
ZBritney2 小时前
JAVA中的多线程
java
Codebee2 小时前
# 🔥A2UI封神!元数据驱动的AI交互新范式,技术人必看
前端·架构
whn19772 小时前
达梦数据库的整体负载变化查看
java·开发语言·数据库
小满、2 小时前
RabbitMQ:Fanout、Direct、Topic 交换机、队列声明与消息转换器
java·分布式·消息队列·rabbitmq·spring amqp
檀越剑指大厂2 小时前
【Idea系列】换行处理
java·ide·intellij-idea
散一世繁华,颠半世琉璃2 小时前
三大设计范式:TDD 筑基,DDD 破局,六边形架构解耦
架构·tdd
wanghowie2 小时前
01.04 Java基础篇|泛型、注解与反射实战
java·开发语言·windows
深圳佛手2 小时前
Java大对象(如 List、Map)如何复用?错误的方法是?正确的方法是?
java·jvm·windows