跳到正文
Joeplover
后端开发·2026-04-25·约 3 分钟阅读

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 版本不匹配 JDKGradle 7.x 不兼容 JDK 17升级 Wrapper 到 8.x
Docker 镜像过大使用完整 JDK改用 JRE + 多阶段构建
数据库连接失败容器启动顺序问题加 healthcheck 条件
Alpine 缺少字体Spring Boot PDF 导出用到手动安装 fontconfig

总结

Gradle + Docker 是当前 Java 项目工程化的黄金组合。Gradle 解决构建效率问题,Docker 解决部署一致性问题。这个项目帮助我掌握了这两套工具的实战用法。