全部笔记All notes

SpringBoot 项目结构详解

阅读 4m 49s4m 49s read

概述

SpringBoot 是基于 Spring 框架的快速开发脚手架,它通过约定优于配置的理念,大大简化了 Spring 应用的初始搭建和开发过程。了解 SpringBoot 项目的文件结构对于快速上手开发至关重要。

💡 提示: SpringBoot 采用标准的 Maven 项目结构,遵循约定优于配置的原则,使开发者能够快速构建生产级应用。

项目结构总览

一个标准的 SpringBoot 项目包含以下核心文件和目录:

my-springboot-project/
├── .mvn/                           # Maven Wrapper 配置
│   └── wrapper/
│       ├── maven-wrapper.jar
│       └── maven-wrapper.properties
├── src/                            # 源代码目录
│   ├── main/                       # 主代码
│   │   ├── java/                   # Java 源码
│   │   └── resources/              # 资源文件
│   └── test/                       # 测试代码
├── target/                         # 构建输出目录
├── .gitignore                      # Git 忽略文件
├── HELP.md                         # 项目帮助文档
├── mvnw                           # Maven Wrapper (Linux/Mac)
├── mvnw.cmd                       # Maven Wrapper (Windows)
├── pom.xml                        # Maven 配置文件
└── ${project-name}.iml            # IntelliJ IDEA 模块文件

SpringBoot项目结构

核心目录详解

1. .mvn 目录

.mvn 目录是 Maven Wrapper 的配置目录,用于确保项目在不同环境中使用相同版本的 Maven。

.mvn/
└── wrapper/
    ├── maven-wrapper.jar           # Maven Wrapper 执行器
    └── maven-wrapper.properties    # Maven 版本配置

主要作用:

  • 统一团队开发环境中的 Maven 版本
  • 避免因 Maven 版本不同导致的构建问题
  • 支持在未安装 Maven 的环境中执行构建

.mvn目录结构

2. src 目录

src 目录是项目的源代码根目录,采用标准的 Maven 目录结构:

src/
├── main/                          # 主程序源码
│   ├── java/                      # Java 源代码
│   │   └── com/                   # 包结构
│   │       └── company/
│   │           └── project/
│   │               ├── Application.java        # 主启动类
│   │               ├── controller/             # 控制层
│   │               ├── service/                # 服务层
│   │               ├── repository/             # 数据访问层
│   │               ├── entity/                 # 实体类
│   │               ├── dto/                    # 数据传输对象
│   │               └── config/                 # 配置类
│   └── resources/                 # 资源文件
│       ├── static/                # 静态资源 (CSS, JS, 图片等)
│       ├── templates/             # 模板文件 (Thymeleaf, FreeMarker等)
│       ├── application.yml        # 主配置文件
│       ├── application-dev.yml    # 开发环境配置
│       ├── application-prod.yml   # 生产环境配置
│       └── logback-spring.xml     # 日志配置
└── test/                         # 测试代码
    ├── java/                     # 测试 Java 代码
    └── resources/                # 测试资源文件

src目录结构

主要子目录说明:

目录说明示例文件
main/javaJava 源代码Controller, Service, Entity
main/resources/static静态资源CSS, JS, 图片, HTML
main/resources/templates动态模板Thymeleaf, Velocity 模板
main/resources配置文件application.yml, logback.xml
test/java单元测试JUnit 测试类

3. target 目录

target 目录是 Maven 构建过程中的输出目录,包含编译后的文件:

target/
├── classes/                       # 编译后的 class 文件
├── test-classes/                  # 测试 class 文件
├── generated-sources/             # 生成的源码
├── maven-status/                  # Maven 状态信息
├── ${artifactId}-${version}.jar   # 可执行 JAR 包
└── ${artifactId}-${version}-sources.jar  # 源码 JAR 包

target目录结构

重要文件:

  • classes/: 编译后的字节码文件
  • {project-name}.jar: 可执行的 Fat JAR 文件
  • maven-archiver/: Maven 打包信息

配置文件说明

1. .gitignore

用于指定 Git 版本控制忽略的文件和目录:

# 编译输出
target/
*.class

# 日志文件
*.log

# IDE 文件
.idea/
*.iml
.vscode/

# OS 文件
.DS_Store
Thumbs.db

# Maven
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar

⚠️ 注意: 文档中提到的 .getignore 应该是 .gitignore 的笔误。

2. HELP.md

项目帮助文档,通常包含:

  • 项目简介和架构说明
  • 快速启动指南
  • API 文档链接
  • 开发规范和约定

3. mvnw 和 mvnw.cmd

Maven Wrapper 脚本文件:

文件平台作用
mvnwLinux/MacUnix 系统的 Maven 包装器
mvnw.cmdWindowsWindows 系统的 Maven 包装器

使用示例:

# Linux/Mac
./mvnw clean install
./mvnw spring-boot:run

# Windows
mvnw.cmd clean install
mvnw.cmd spring-boot:run

4. pom.xml

Maven 项目配置文件,定义了项目的依赖、插件和构建配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 项目基本信息 -->
    <groupId>com.example</groupId>
    <artifactId>my-springboot-app</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    
    <!-- SpringBoot 父项目 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.0</version>
        <relativePath/>
    </parent>
    
    <!-- 项目属性 -->
    <properties>
        <java.version>17</java.version>
    </properties>
    
    <!-- 依赖管理 -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 更多依赖... -->
    </dependencies>
    
    <!-- 构建配置 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

5. ${project-name}.iml

IntelliJ IDEA 模块信息文件,存储:

  • 模块配置信息
  • Maven 组件信息
  • 模块路径信息
  • 依赖关系

💡 提示: .iml 文件由 IDE 自动生成,通常应该加入 .gitignore 中。

最佳实践

1. 包结构组织

推荐的包结构:

com.company.project/
├── Application.java               # 主启动类
├── controller/                    # 控制器层
│   ├── UserController.java
│   └── ProductController.java
├── service/                       # 服务层
│   ├── UserService.java
│   └── ProductService.java
├── repository/                    # 数据访问层
│   ├── UserRepository.java
│   └── ProductRepository.java
├── entity/                        # 实体类
│   ├── User.java
│   └── Product.java
├── dto/                          # 数据传输对象
│   ├── request/
│   └── response/
├── config/                       # 配置类
│   ├── DatabaseConfig.java
│   └── SecurityConfig.java
├── exception/                    # 异常处理
│   └── GlobalExceptionHandler.java
└── util/                        # 工具类
    └── DateUtils.java

2. 配置文件管理

# application.yml (主配置)
spring:
  profiles:
    active: @spring.profiles.active@
  application:
    name: my-springboot-app

---
# application-dev.yml (开发环境)
spring:
  config:
    activate:
      on-profile: dev
  datasource:
    url: jdbc:mysql://localhost:3306/dev_db

---
# application-prod.yml (生产环境)
spring:
  config:
    activate:
      on-profile: prod
  datasource:
    url: jdbc:mysql://prod-server:3306/prod_db

3. 资源文件组织

resources/
├── static/                       # 静态资源
│   ├── css/
│   ├── js/
│   ├── images/
│   └── favicon.ico
├── templates/                    # 模板文件
│   ├── index.html
│   └── user/
│       └── profile.html
├── i18n/                        # 国际化资源
│   ├── messages.properties
│   ├── messages_en.properties
│   └── messages_zh.properties
└── db/                          # 数据库相关
    ├── migration/               # Flyway 迁移脚本
    └── data.sql                 # 初始化数据

开发流程

1. 项目初始化

# 使用 Spring Initializr 创建项目
curl https://start.spring.io/starter.zip \
  -d dependencies=web,data-jpa,mysql \
  -d name=my-project \
  -d packageName=com.example.myproject \
  -o my-project.zip

# 解压并导入 IDE
unzip my-project.zip
cd my-project

2. 本地开发

# 运行应用
./mvnw spring-boot:run

# 或者
./mvnw clean compile
./mvnw exec:java -Dexec.mainClass="com.example.Application"

3. 测试和构建

# 运行测试
./mvnw test

# 打包应用
./mvnw clean package

# 运行打包后的应用
java -jar target/my-project-1.0.0.jar

常见问题

问题1:编码问题

现象: 中文字符乱码 解决方案:

<!-- 在 pom.xml 中设置编码 -->
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
</properties>

问题2:端口冲突

现象: 应用启动失败,端口被占用 解决方案:

# application.yml
server:
  port: 8081  # 修改默认端口

问题3:热部署不生效

现象: 代码修改后需要手动重启 解决方案:

<!-- 添加 devtools 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>

相关文章

SpringBoot 系列

Java 基础

  • [Java EE 企业级开发](../JAVA EE/)
  • Maven 生命周期详解

数据库集成

运维部署

问题排查

上一章 / 下一章