Spring Boot + Maven 多模块项目指南

7 阅读3分钟

一、项目整体结构(先建好文件夹)

your-project/          # 根目录(父POM)
├── pom.xml            # 父POM文件
├── your-project-common/  # 通用模块(工具类、常量等)
│   └── pom.xml
├── your-project-service/ # 业务逻辑模块
│   └── pom.xml
└── your-project-web/     # Web接口模块(最终可运行)
    └── pom.xml

二、父 POM(root/pom.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">
    <modelVersion>4.0.0</modelVersion>

    <!-- 1. 父POM基本信息 -->
    <groupId>com.yourcompany</groupId>
    <artifactId>your-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging> <!-- 多模块父POM必须是pom打包 -->
    <name>your-project</name>
    <description>Spring Boot多模块项目父POM</description>

    <!-- 2. 声明子模块(和文件夹名对应) -->
    <modules>
        <module>your-project-common</module>
        <module>your-project-service</module>
        <module>your-project-web</module>
    </modules>

    <!-- 3. 全局属性(统一版本、编码等) -->
    <properties>
        <maven.compiler.source>17</maven.compiler.source> <!-- 推荐Java 17,适配Spring Boot 4.x -->
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.boot.version>4.0.1</spring.boot.version> <!-- 统一Spring Boot版本 -->
    </properties>

    <!-- 4. 依赖版本管理(BOM核心):只锁版本,不引包 -->
    <dependencyManagement>
        <dependencies>
            <!-- 引入Spring Boot官方BOM,统一所有Spring Boot依赖版本 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- 自定义子模块依赖版本(示例:common模块) -->
            <dependency>
                <groupId>com.yourcompany</groupId>
                <artifactId>your-project-common</artifactId>
                <version>${project.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- 5. 插件版本管理:只定义规则,不执行 -->
    <build>
        <pluginManagement>
            <plugins>
                <!-- Spring Boot打包插件(核心) -->
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${spring.boot.version}</version>
                    <!-- 配置可继承,子模块直接用 -->
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal> <!-- 打包成可运行jar -->
                            </goals>
                        </execution>
                    </executions>
                </plugin>

                <!-- 编译插件(统一Java版本) -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.11.0</version>
                    <configuration>
                        <source>${maven.compiler.source}</source>
                        <target>${maven.compiler.target}</target>
                        <encoding>${project.build.sourceEncoding}</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

三、子模块1:common(your-project-common/pom.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>
        <groupId>com.yourcompany</groupId>
        <artifactId>your-project</artifactId>
        <version>1.0.0</version>
        <!-- 父POM相对路径(如果子模块在根目录下,可省略) -->
        <relativePath>../pom.xml</relativePath>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>your-project-common</artifactId>
    <name>your-project-common</name>
    <description>通用工具类模块</description>
    <packaging>jar</packaging> <!-- 普通jar,不是可运行jar -->

    <!-- 依赖:按需引入,不用写版本(父BOM已管理) -->
    <dependencies>
        <!-- Spring Boot基础工具(如配置、日志) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- Lombok(简化代码) -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <!-- 插件:无需Spring Boot打包插件(纯工具类) -->
    <build>
        <plugins>
            <!-- 只需要编译插件(父pluginManagement已定义,直接用) -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

四、子模块2:service(your-project-service/pom.xml)

核心:业务逻辑模块,依赖common,不直接对外提供接口

<?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>
        <groupId>com.yourcompany</groupId>
        <artifactId>your-project</artifactId>
        <version>1.0.0</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>your-project-service</artifactId>
    <name>your-project-service</name>
    <description>业务逻辑模块</description>
    <packaging>jar</packaging>

    <!-- 依赖:引入common模块 + 业务相关依赖 -->
    <dependencies>
        <!-- 依赖自己的common模块(版本继承父POM) -->
        <dependency>
            <groupId>com.yourcompany</groupId>
            <artifactId>your-project-common</artifactId>
        </dependency>

        <!-- Spring Boot数据访问(示例:MyBatis) -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version> <!-- 非Spring Boot官方starter需写版本 -->
        </dependency>

        <!-- 数据库驱动(示例:MySQL) -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <!-- 插件:仅编译插件,无需打包插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

五、子模块3:web(your-project-web/pom.xml)

核心:最终可运行的Web模块,依赖service,打包成可执行jar

<?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>
        <groupId>com.yourcompany</groupId>
        <artifactId>your-project</artifactId>
        <version>1.0.0</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>your-project-web</artifactId>
    <name>your-project-web</name>
    <description>Web接口模块(可运行)</description>
    <packaging>jar</packaging>

    <!-- 依赖:引入service + Web相关依赖 -->
    <dependencies>
        <!-- 依赖业务逻辑模块 -->
        <dependency>
            <groupId>com.yourcompany</groupId>
            <artifactId>your-project-service</artifactId>
        </dependency>

        <!-- Spring Boot Web(MVC + Tomcat) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot测试(可选) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 插件:启用Spring Boot打包插件(父pluginManagement已定义版本) -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!-- 可选:指定主类(也可以在代码里用@SpringBootApplication注解) -->
                <configuration>
                    <mainClass>com.yourcompany.web.Application</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

六、配套启动类(web模块)

your-project-web/src/main/java/com/yourcompany/web/ 下创建 Application.java

package com.yourcompany.web;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

// 扫描所有子模块的包(根据自己的包结构调整)
@SpringBootApplication(scanBasePackages = "com.yourcompany")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

七、使用说明

  1. 替换占位符:把所有 com.yourcompanyyour-project 换成你自己的公司/项目名;
  2. 调整Java版本:如果用Java 8,把 17 改成 8,Spring Boot版本建议用 2.7.x(适配Java 8);
  3. 打包运行
    • 根目录执行 mvn clean package(所有模块打包);
    • 进入web模块目录,执行 java -jar target/your-project-web-1.0.0.jar 即可运行;
  4. 按需扩展:可新增 model(实体类)、api(接口定义)等子模块,结构和common/service一致。

总结

  1. 父POM核心职责:通过 dependencyManagement 锁版本、pluginManagement 定插件规则,不引包、不执行插件;
  2. 子模块分工:common/service做纯依赖模块(普通jar),web做可运行模块(启用Spring Boot打包插件);
  3. 版本管理原则:Spring Boot官方starter不用写版本(父BOM管理),非官方starter需手动指定版本。

这套模板完全遵循文章里的最佳实践,没有冗余配置,新手直接用不会踩坑~