Appearance
构建 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:devdbbash
# 激活不同 profile
./gradlew bootRun --args='--spring.profiles.active=prod'
java -jar app.jar --spring.profiles.active=prodDocker 部署
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-appCI/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 }}