Skip to content

buildSrc

buildSrc 是一个特殊目录,Gradle 会自动将其编译并加入构建脚本的 classpath,用于共享构建逻辑(自定义 Task、插件、版本常量等)。

目录结构

project-root/
├── buildSrc/
│   ├── build.gradle.kts       ← buildSrc 自身的构建脚本
│   ├── settings.gradle.kts    ← 可选
│   └── src/
│       └── main/
│           └── kotlin/
│               ├── Versions.kt          ← 版本常量
│               ├── Dependencies.kt      ← 依赖常量
│               └── java-conventions.gradle.kts  ← 约定插件
├── core/
│   └── build.gradle.kts
└── web/
    └── build.gradle.kts

buildSrc/build.gradle.kts

kotlin
// buildSrc/build.gradle.kts
plugins {
    `kotlin-dsl`  // 支持编写 Kotlin DSL 插件
}

repositories {
    mavenCentral()
    gradlePluginPortal()
}

dependencies {
    // 在约定插件中使用的 Gradle 插件
    implementation("org.springframework.boot:spring-boot-gradle-plugin:3.2.0")
    implementation("io.spring.gradle:dependency-management-plugin:1.1.4")
}

版本常量

kotlin
// buildSrc/src/main/kotlin/Versions.kt
object Versions {
    const val JAVA = 17
    const val SPRING_BOOT = "3.2.0"
    const val KOTLIN = "1.9.22"
    const val JUNIT = "5.10.1"
    const val GUAVA = "32.0.1-jre"
    const val LOMBOK = "1.18.30"
}

object Libs {
    const val SPRING_BOOT_WEB = 
        "org.springframework.boot:spring-boot-starter-web:${Versions.SPRING_BOOT}"
    const val SPRING_BOOT_TEST = 
        "org.springframework.boot:spring-boot-starter-test:${Versions.SPRING_BOOT}"
    const val JUNIT_JUPITER = 
        "org.junit.jupiter:junit-jupiter:${Versions.JUNIT}"
    const val GUAVA = 
        "com.google.guava:guava:${Versions.GUAVA}"
    const val LOMBOK = 
        "org.projectlombok:lombok:${Versions.LOMBOK}"
}

约定插件(Convention Plugin)

kotlin
// buildSrc/src/main/kotlin/java-conventions.gradle.kts
plugins {
    java
    checkstyle
    jacoco
}

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

tasks.withType<JavaCompile> {
    options.encoding = "UTF-8"
}

tasks.withType<Test> {
    useJUnitPlatform()
    maxHeapSize = "1g"
}

// 代码检查
checkstyle {
    toolVersion = "10.12.5"
    configFile = rootProject.file("config/checkstyle.xml")
}

// 覆盖率
jacoco {
    toolVersion = "0.8.11"
}

dependencies {
    "testImplementation"("org.junit.jupiter:junit-jupiter:${Versions.JUNIT}")
    "testRuntimeOnly"("org.junit.platform:junit-platform-launcher")
}
kotlin
// buildSrc/src/main/kotlin/spring-boot-conventions.gradle.kts
plugins {
    id("java-conventions")                         // 继承 java 约定
    id("org.springframework.boot")
    id("io.spring.dependency-management")
}

dependencies {
    "implementation"(platform("org.springframework.boot:spring-boot-dependencies:${Versions.SPRING_BOOT}"))
    "testImplementation"("org.springframework.boot:spring-boot-starter-test")
}

在子项目中使用

kotlin
// web/build.gradle.kts
plugins {
    id("spring-boot-conventions")   // 应用约定插件,获得所有标准配置
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
}

buildSrc vs 版本目录

buildSrc版本目录
主要用途共享构建逻辑、约定插件集中管理版本号
类型安全是(生成访问器)
IDE 支持完整完整
修改后触发重新配置触发重新配置
推荐组合✅ 两者结合使用✅ 两者结合使用

下一步