一、项目整体结构(先建好文件夹)
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);
}
}
七、使用说明
- 替换占位符:把所有
com.yourcompany、your-project换成你自己的公司/项目名; - 调整Java版本:如果用Java 8,把
17改成8,Spring Boot版本建议用2.7.x(适配Java 8); - 打包运行:
- 根目录执行
mvn clean package(所有模块打包); - 进入web模块目录,执行
java -jar target/your-project-web-1.0.0.jar即可运行;
- 根目录执行
- 按需扩展:可新增
model(实体类)、api(接口定义)等子模块,结构和common/service一致。
总结
- 父POM核心职责:通过
dependencyManagement锁版本、pluginManagement定插件规则,不引包、不执行插件; - 子模块分工:common/service做纯依赖模块(普通jar),web做可运行模块(启用Spring Boot打包插件);
- 版本管理原则:Spring Boot官方starter不用写版本(父BOM管理),非官方starter需手动指定版本。
这套模板完全遵循文章里的最佳实践,没有冗余配置,新手直接用不会踩坑~