springboot+gradle使用kotlin DSL的配置实例

1,581 阅读1分钟

项目结构

实例项目是一个简单的调度器项目,其中包含四个子模块。

  • job-common 通用模块
  • job-util 工具类模块
  • job-scheduler 调度中心模块
  • job-admin 调度管理模块 各模块之间的继承关系如下图所示 gradle项目架构.png

父项目build.gradle.kts

plugins定义在所有项目都会生效的插件。 subprojects中指定的配置在所有子项目中生效,其中dependencyManagement中借鉴了maven,可以引入BOM来方便地定义大多数依赖的版本信息。 allprojects中指定了所有项目中依赖的仓库镜像信息。

plugins {
    kotlin("jvm")
    java
    id("io.spring.dependency-management")

    kotlin("plugin.lombok")
    id("io.freefair.lombok")
}


allprojects {
    repositories {
        mavenLocal()
        maven { setUrl("https://maven.aliyun.com/repository/public") }
        maven { setUrl("https://maven.aliyun.com/repository/central") }
        maven { setUrl("https://maven.aliyun.com/repository/spring") }
        maven { setUrl("https://maven.aliyun.com/repository/jcenter") }
        maven { setUrl("https://maven.aliyun.com/repository/apache-snapshots") }
        maven { setUrl("https://maven.aliyun.com/repository/google") }
        maven { setUrl("https://maven.aliyun.com/repository/releases") }
        maven { setUrl("https://maven.aliyun.com/repository/snapshots") }
        maven { setUrl("https://maven.aliyun.com/repository/grails-core") }
        maven { setUrl("https://maven.aliyun.com/repository/mapr-public") }
        maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin") }
        maven { setUrl("https://maven.aliyun.com/repository/spring-plugin") }
        mavenCentral()
    }
}

subprojects {
    group = "com.peaksong"
    version = "0.0.1-SNAPSHOT"

    apply(plugin = "java")
    apply(plugin = "kotlin")
    apply(plugin = "io.spring.dependency-management")

    java.sourceCompatibility = JavaVersion.VERSION_1_8
    java.targetCompatibility = JavaVersion.VERSION_1_8


    dependencies {

        implementation("com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery")
        implementation("com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config")
        implementation("org.springframework.cloud:spring-cloud-starter-bootstrap")

        implementation("org.jetbrains.kotlin:kotlin-reflect")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
        implementation("org.springframework.cloud:spring-cloud-starter-openfeign")
        runtimeOnly("org.postgresql:postgresql")
        testImplementation("org.springframework.boot:spring-boot-starter-test") {
            exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
        }

    }

    extra["springCloudAlibabaVersion"] = "2021.1"
    extra["springCloudVersion"] = "2020.0.3"
    extra["springBootVersion"] = "2.4.10"
    extra["kotlin.version"] = "1.5.21"

    dependencyManagement {

        imports {
            mavenBom("com.alibaba.cloud:spring-cloud-alibaba-dependencies:${property("springCloudAlibabaVersion")}")
            mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}")
            mavenBom("org.springframework.boot:spring-boot-dependencies:${property("springBootVersion")}")
        }

        dependencies {
            dependency("io.netty:netty-all:4.1.67.Final")
            dependency("org.jctools:jctools-core:3.3.0")
            project(":job-util")
            project(":job-common")
        }
    }


}

父项目settings.gradle.kts

在该文件中,定义子项目名称,pluginManagement中声明项目中用到的通用插件,同时指定插件下载的镜像仓库地址列表,include所有模块。

rootProject.name = "scheduler"

pluginManagement {
    plugins {
        id("org.springframework.boot") version "2.4.2"    // 影响springboot 打包 会产生 bootJar 任务
        id("io.spring.dependency-management") version "1.0.10.RELEASE"  // springboot默认以来管理
        kotlin("jvm") version "1.5.31"
        kotlin("plugin.spring") version "1.5.31"
        kotlin("plugin.jpa") version "1.5.31"

        kotlin("plugin.lombok") version "1.5.31"
        id("io.freefair.lombok") version "5.3.0"
    }

    repositories {
        mavenLocal()
        maven{ setUrl("https://maven.aliyun.com/repository/gradle-plugin") }
        maven{ setUrl("https://maven.aliyun.com/repository/spring-plugin") }
        maven{ setUrl("https://maven.aliyun.com/repository/central") }
        maven{ setUrl("https://maven.aliyun.com/repository/public") }
    }
}

include(":job-util")
include(":job-common")
include(":job-scheduler")
include(":job-admin")

子项目build.gradle.kts

job-admin子项目的配置为例 以implementation(project(":job-common"))引入job-common模块

dependencies {
    implementation(project(":job-common"))
    implementation(project(":job-util"))
}

tasks.getByName<Test>("test") {
    useJUnitPlatform()
}

子项目settings.gradle.kts

以job-admin子项目的配置为例

rootProject.name = "job-admin"

补充

如果有依赖版本冲突,可以通过以下方式解决。

configurations.all {
    resolutionStrategy {
        force("com.google.guava:guava:20.0")
    }
}

排除某些依赖

configurations.all {
    exclude("log4j", "log4j")
}