Shopping Mall:Gradle + Docker 全栈商城
全栈电商项目,Gradle 构建、Docker 部署、Spring Boot 后端 + 前端分离,集成分布式锁、幂等性和操作日志。
Shopping Mall:Gradle + Docker 全栈商城工程化实践
项目背景
Shopping Mall 是一个全栈电商演示项目,但我更看重的是它作为 Java 工程化工具的实践平台——主要学习 Gradle 构建系统和 Docker 容器化部署。很多初学者把 Gradle 当成简单的"Maven 替代品",但 Gradle 的增量编译、DSL 灵活性、多项目构建能力远比 Maven 强大。
Gradle vs Maven
构建脚本简洁性
Maven 的 pom.xml 是 XML 格式,一个中等项目动辄几百行 XML。Gradle 使用 Groovy/Kotlin DSL:
// Maven 50 行 XML 做的事,Gradle 10 行搞定
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.0'
id 'io.spring.dependency-management' version '1.1.4'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.mysql:mysql-connector-j'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
增量编译
Gradle 的增量编译是它最大的性能优势。第一次构建后,第二次构建只编译修改过的文件,速度比 Maven 快 5-10 倍。对于大型项目这个差距非常明显。
Wrapper 保证版本一致
./gradlew build # 自动下载指定版本 Gradle,保证团队构建环境一致
Gradle Wrapper 避免了"我本地可以"问题——所有开发者使用相同版本的 Gradle 构建。
Docker 多阶段构建
Spring Boot 应用打包后是 fat JAR,一个 JAR 里包含所有依赖。直接用 JDK 运行 fat JAR 的镜像有 500MB+。使用多阶段构建大幅缩小:
# 第一阶段:编译
FROM eclipse-temurin:17-jdk AS builder
WORKDIR /app
COPY build/libs/*.jar app.jar
RUN java -Djarmode=layertools -jar app.jar extract
# 第二阶段:运行 - 只包含 JRE
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /app/dependencies/ ./
COPY --from=builder /app/spring-boot-loader/ ./
COPY --from=builder /app/snapshot-dependencies/ ./
COPY --from=builder /app/application/ ./
EXPOSE 8080
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
镜像大小从 500MB 压缩到 150MB,而且利用了 Spring Boot 的分层解压——只更新业务代码层时,依赖层可以使用缓存。
Docker Compose 编排
version: '3.8'
services:
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: shopping
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
retries: 5
app:
build: .
depends_on:
mysql:
condition: service_healthy
ports:
- "8080:8080"
关键:用 healthcheck 确保数据库容器完全就绪后才启动应用容器,避免应用启动时连不上数据库报错。
踩坑记录
| 问题 | 原因 | 解决 |
|---|---|---|
| Wrapper 版本不匹配 JDK | Gradle 7.x 不兼容 JDK 17 | 升级 Wrapper 到 8.x |
| Docker 镜像过大 | 使用完整 JDK | 改用 JRE + 多阶段构建 |
| 数据库连接失败 | 容器启动顺序问题 | 加 healthcheck 条件 |
| Alpine 缺少字体 | Spring Boot PDF 导出用到 | 手动安装 fontconfig |
总结
Gradle + Docker 是当前 Java 项目工程化的黄金组合。Gradle 解决构建效率问题,Docker 解决部署一致性问题。这个项目帮助我掌握了这两套工具的实战用法。