引入:
在大型 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 拆分步骤
- 创建父项目(`maven_parent09`),统一管理依赖版本、插件等;
- 基于父项目创建子模块(
maven_pojo、maven-dao、maven-service、maven-control); - 配置模块间的依赖(如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 多模块开发的优势
- 职责单一:每个模块只做一件事,代码解耦,便于维护;
- 复用性高:`maven_pojo`、`maven-dao` 可被多个项目复用;
- 版本统一:父项目统一管理依赖版本,避免版本冲突;
- 构建高效:聚合项目可一键构建所有模块,按依赖顺序自动执行。
五、总结
Maven 多模块开发是大型 Java 项目的标准实践,核心流程是:
- 拆分:按分层架构拆分模块,每个模块承担单一职责;
- 依赖:通过 Maven 坐标配置模块间的依赖;
- 构建:一键构建整个项目,按依赖顺序执行。
掌握 Maven 多模块开发,能帮助你应对大型项目的代码管理与协作问题,是后端开发工程师的必备技能。