Skip to content

构建多模块项目

项目结构

company-platform/
├── settings.gradle.kts
├── build.gradle.kts              ← 根项目
├── gradle/
│   ├── libs.versions.toml
│   └── wrapper/
├── buildSrc/                     ← 共享构建逻辑
│   ├── build.gradle.kts
│   └── src/main/kotlin/
│       ├── java-conventions.gradle.kts
│       └── spring-conventions.gradle.kts
├── common/                       ← 公共库
│   └── build.gradle.kts
├── domain/                       ← 领域模型
│   └── build.gradle.kts
├── service/
│   ├── user-service/             ← 用户服务
│   │   └── build.gradle.kts
│   └── order-service/            ← 订单服务
│       └── build.gradle.kts
└── gateway/                      ← API 网关
    └── build.gradle.kts

settings.gradle.kts

kotlin
rootProject.name = "company-platform"

pluginManagement {
    includeBuild("buildSrc")
    repositories {
        gradlePluginPortal()
        mavenCentral()
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        mavenCentral()
    }
}

include(
    "common",
    "domain",
    "service:user-service",
    "service:order-service",
    "gateway"
)

buildSrc/src/main/kotlin/java-conventions.gradle.kts

kotlin
plugins {
    java
    checkstyle
    jacoco
}

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

tasks.withType<JavaCompile> {
    options.encoding = "UTF-8"
    options.compilerArgs.add("-parameters")
}

tasks.withType<Test> {
    useJUnitPlatform()
    testLogging { events("passed", "failed") }
}

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

tasks.named("check") {
    dependsOn(tasks.named("jacocoTestReport"))
}

buildSrc/src/main/kotlin/spring-conventions.gradle.kts

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

val libs = extensions.getByType<VersionCatalogsExtension>().named("libs")

dependencies {
    "implementation"(platform(libs.findLibrary("spring-boot-bom").get()))
    "testImplementation"(libs.findLibrary("spring-boot-test").get())
}

各模块 build.gradle.kts

kotlin
// common/build.gradle.kts
plugins {
    id("java-conventions")
    `java-library`
}

dependencies {
    api(libs.guava)
    api(libs.slf4j.api)
    implementation(libs.jackson.databind)
}
kotlin
// domain/build.gradle.kts
plugins {
    id("java-conventions")
    `java-library`
}

dependencies {
    api(project(":common"))
    compileOnly(libs.lombok)
    annotationProcessor(libs.lombok)
}
kotlin
// service/user-service/build.gradle.kts
plugins {
    id("spring-conventions")
}

dependencies {
    implementation(project(":domain"))
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    runtimeOnly("com.mysql:mysql-connector-j")
}

根项目 build.gradle.kts

kotlin
// 根项目不声明任何插件
// 仅提供通用任务,如生成版本报告
tasks.register("printVersions") {
    group = "help"
    doLast {
        subprojects.forEach { p ->
            println("${p.name}: ${p.version}")
        }
    }
}

构建命令

bash
# 构建所有模块
./gradlew build --parallel

# 只构建用户服务
./gradlew :service:user-service:build

# 测试所有模块
./gradlew test --parallel

# 查看所有模块
./gradlew projects

# 查看模块间依赖
./gradlew :service:user-service:dependencies --configuration compileClasspath