Skip to content

构建 Spring Boot 项目

项目初始化

访问 Spring Initializr,选择:

  • Project:Gradle - Kotlin
  • Language:Java
  • Spring Boot:3.2.0
  • Dependencies:Spring Web、Spring Data JPA、Lombok、MySQL Driver、Spring Boot Test

完整的 build.gradle.kts

kotlin
plugins {
    java
    id("org.springframework.boot") version "3.2.0"
    id("io.spring.dependency-management") version "1.1.4"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

configurations {
    compileOnly {
        extendsFrom(configurations.annotationProcessor.get())
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // Spring Boot
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-validation")
    implementation("org.springframework.boot:spring-boot-starter-security")
    
    // 数据库
    runtimeOnly("com.mysql:mysql-connector-j")
    runtimeOnly("com.h2database:h2")  // 测试用
    
    // 工具库
    compileOnly("org.projectlombok:lombok")
    annotationProcessor("org.projectlombok:lombok")
    implementation("org.mapstruct:mapstruct:1.5.5.Final")
    annotationProcessor("org.mapstruct:mapstruct-processor:1.5.5.Final")
    
    // 开发工具
    developmentOnly("org.springframework.boot:spring-boot-devtools")
    
    // 测试
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.springframework.security:spring-security-test")
}

tasks.named<Test>("test") {
    useJUnitPlatform()
    systemProperty("spring.profiles.active", "test")
    testLogging {
        events("passed", "failed")
    }
}

tasks.named<org.springframework.boot.gradle.tasks.bundling.BootJar>("bootJar") {
    archiveFileName.set("app.jar")
    
    layered {
        enabled.set(true)
    }
}

// 生成构建信息(可在 /actuator/info 访问)
springBoot {
    buildInfo()
}

版本目录方式(推荐)

toml
# gradle/libs.versions.toml
[versions]
spring-boot = "3.2.0"
dependency-management = "1.1.4"
mapstruct = "1.5.5.Final"
lombok = "1.18.30"

[libraries]
spring-boot-web = { module = "org.springframework.boot:spring-boot-starter-web" }
spring-boot-jpa = { module = "org.springframework.boot:spring-boot-starter-data-jpa" }
spring-boot-test = { module = "org.springframework.boot:spring-boot-starter-test" }
spring-boot-bom = { module = "org.springframework.boot:spring-boot-dependencies", version.ref = "spring-boot" }
mapstruct = { module = "org.mapstruct:mapstruct", version.ref = "mapstruct" }
mapstruct-processor = { module = "org.mapstruct:mapstruct-processor", version.ref = "mapstruct" }
lombok = { module = "org.projectlombok:lombok", version.ref = "lombok" }

[plugins]
spring-boot = { id = "org.springframework.boot", version.ref = "spring-boot" }
dependency-management = { id = "io.spring.dependency-management", version.ref = "dependency-management" }

多环境配置

src/main/resources/
├── application.yml          ← 公共配置
├── application-dev.yml      ← 开发环境
├── application-test.yml     ← 测试环境
└── application-prod.yml     ← 生产环境
yaml
# application.yml
spring:
  profiles:
    active: dev  # 默认激活 dev

---
spring:
  config:
    activate:
      on-profile: dev
  datasource:
    url: jdbc:h2:mem:devdb
bash
# 激活不同 profile
./gradlew bootRun --args='--spring.profiles.active=prod'
java -jar app.jar --spring.profiles.active=prod

Docker 部署

dockerfile
# Dockerfile
FROM eclipse-temurin:17-jre-jammy AS builder
WORKDIR /app
COPY build/libs/app.jar app.jar
RUN java -Djarmode=layertools -jar app.jar extract

FROM eclipse-temurin:17-jre-jammy
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/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]
bash
# 构建 Docker 镜像
./gradlew bootJar
docker build -t my-spring-app .
docker run -p 8080:8080 -e SPRING_PROFILES_ACTIVE=prod my-spring-app

CI/CD 配置

yaml
# .github/workflows/build.yml
name: Build and Deploy

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - uses: gradle/actions/setup-gradle@v3
      - run: ./gradlew build
      - run: docker build -t ${{ secrets.DOCKER_REGISTRY }}/my-app:${{ github.sha }} .
      - run: docker push ${{ secrets.DOCKER_REGISTRY }}/my-app:${{ github.sha }}