springboot gradle kotlin 多模块(或微服务)统一依赖及版本管理和构建不同环境打包task,docker镜像构建task

这篇具有很好参考价值的文章主要介绍了springboot gradle kotlin 多模块(或微服务)统一依赖及版本管理和构建不同环境打包task,docker镜像构建task。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景描述

在maven里可以在pom.xml中统一定义项目依赖,依赖版本,插件,多环境构建,子模块;定义packaging 为pom类型,各子模块按需引入,并且指定环境profiles构建。
在gradle中也可以实现依赖统一管理,各模块按需引入,区分环境的构建任务。

先上效果图
统一定义依赖,依赖版本,插件
gradle 构建spring cloud 微服务工程,spring boot,kotlin,微服务,gradle,javagradle 构建spring cloud 微服务工程,spring boot,kotlin,微服务,gradle,java
gradle 构建spring cloud 微服务工程,spring boot,kotlin,微服务,gradle,java
子模块按需引入
gradle 构建spring cloud 微服务工程,spring boot,kotlin,微服务,gradle,java
分环境打包task及docker镜像打包任务
gradle 构建spring cloud 微服务工程,spring boot,kotlin,微服务,gradle,java

环境

gradle8.1.1, springboot3.1.0, jdk17

步骤

  1. 创建项目
    通过IDEA或Spring Initializer 创建springboot+kotlin+gradle的基础项目;
  2. 修改gradle/wrapper/gradle-wrapper.properties 中gradle版本 https://services.gradle.org/distributions/gradle-8.1.1-bin.zip
  3. 统一定义依赖,版本,插件;由gradle catalogs实现,catalogs官方文档介绍
  4. 在根目录创建libs.versions.toml 文件,自己当前项目文件内容如下
#### 定义项目所有依赖库
## 统一定义版本
[versions]
project-version= "0.0.1"
springboot = "3.1.0"
kotlin = "1.8.21"
docker-plugin = "9.3.0"
mybatis-plus = "3.5.3"
velocity = "2.0"
mysql = "8.0.32"
hutool = "5.8.17"
knife4j = "4.3.0"
easyexcel = "3.2.1"
dynamic-datasource = "3.6.0"
sa-token = "1.35.0.RC"
spring-cloud = "2022.0.2"
spring-cloud-alibaba = "2022.0.0.0-RC2"
spring-doc = "2.1.0"
spring-redisson = "3.21.3"
dubbo = "3.2.0"
aliyun-sms = "2.0.23"
fastjson2 = "2.0.39"
dingtalk-service-sdk = "2.0.0"
dingtalk-sdk = "2.0.29"
flowable = "7.0.0.M1"
liteflow = "2.10.5"
rocketmq = "2.2.3"
minio = "8.5.4"
## 统一定义依赖
[libraries]
mybatis-plus = { module = "com.baomidou:mybatis-plus-boot-starter", version.ref = "mybatis-plus" }
mybatis-generator = { module = "com.baomidou:mybatis-plus-generator", version.ref = "mybatis-plus" }
velocity = { module = "org.apache.velocity:velocity-engine-core", version.ref = "velocity" }
mysql = { module = "mysql:mysql-connector-java", version.ref = "mysql" }
# 使用的是springdoc-openapi3, https://springdoc.org/#migrating-from-springfox 不再是springfox
knife4j = { module = "com.github.xiaoymin:knife4j-openapi3-jakarta-spring-boot-starter", version.ref = "knife4j" }
knife4j-gateway = { module = "com.github.xiaoymin:knife4j-gateway-spring-boot-starter", version.ref = "knife4j" }
hutool-core = { module = "cn.hutool:hutool-core", version.ref = "hutool" }
hutool-captcha = { module = "cn.hutool:hutool-captcha", version.ref = "hutool" }
hutool-crypto = { module = "cn.hutool:hutool-crypto", version.ref = "hutool" }
hutool-http = { module = "cn.hutool:hutool-http", version.ref = "hutool" }
hutool-extra = { module = "cn.hutool:hutool-extra", version.ref = "hutool" }
hutool-json = { module = "cn.hutool:hutool-json", version.ref = "hutool" }
easyexcel = { module = "com.alibaba:easyexcel", version.ref = "easyexcel" }
satoken-core = { module = "cn.dev33:sa-token-core", version.ref = "sa-token" }
satoken-web = { module = "cn.dev33:sa-token-spring-boot3-starter", version.ref = "sa-token" }
satoken-reactor = { module = "cn.dev33:sa-token-reactor-spring-boot3-starter", version.ref = "sa-token" }
satoken-dubbo = { module = "cn.dev33:sa-token-dubbo", version.ref = "sa-token" }
dynamic-datasource = { module = "com.baomidou:dynamic-datasource-spring-boot-starter", version.ref = "dynamic-datasource" }
spring-boot = { module = "org.springframework.boot:spring-boot-dependencies", version.ref = "springboot" }
spring-cloud = { module = "org.springframework.cloud:spring-cloud-dependencies", version.ref = "spring-cloud" }
spring-cloud-alibaba = { module = "com.alibaba.cloud:spring-cloud-alibaba-dependencies", version.ref = "spring-cloud-alibaba" }
spring-doc-common = { module = "org.springdoc:springdoc-openapi-starter-common", version.ref = "spring-doc" }
spring-doc-webflux = { module = "org.springdoc:springdoc-openapi-starter-webflux-ui", version.ref = "spring-doc" }
spring-doc-webmvc = { module = "org.springdoc:springdoc-openapi-starter-webmvc-ui", version.ref = "spring-doc" }
spring-redisson = { module = "org.redisson:redisson-spring-boot-starter", version.ref = "spring-redisson" }
spring-dubbo = { module = "org.apache.dubbo:dubbo-spring-boot-starter", version.ref = "dubbo" }
dubbo = { module = "org.apache.dubbo:dubbo", version.ref = "dubbo" }
dubbo-nacos = { module = "org.apache.dubbo:dubbo-registry-nacos", version.ref = "dubbo" }
aliyun-sms = { module = "com.aliyun:dysmsapi20170525", version.ref = "aliyun-sms" }
kotlin-fastjosn2 = { module = "com.alibaba.fastjson2:fastjson2-kotlin", version.ref = "fastjson2" }
dingtalk-service = { module = "com.aliyun:alibaba-dingtalk-service-sdk", version.ref = "dingtalk-service-sdk" }
dingtalk-sdk = { module = "com.aliyun:dingtalk", version.ref = "dingtalk-sdk" }
flowable = { module = "org.flowable:flowable-spring-boot-starter", version.ref = "flowable" }
flowable-bpmn-layout = { module = "org.flowable:flowable-bpmn-layout", version.ref = "flowable" }
liteflow = { module = "com.yomahub:liteflow-spring-boot-starter", version.ref = "liteflow" }
rocketmq = { module = "org.apache.rocketmq:rocketmq-spring-boot-starter", version.ref = "rocketmq" }
minio = { module = "io.minio:minio", version.ref = "minio" }
## 将多个需要同时引入的依赖定义成一个组,使用时直接引入组
[bundles]
hutool = ["hutool-core", "hutool-captcha", "hutool-crypto", "hutool-http", "hutool-extra", "hutool-json"]
spring-doc = ["spring-doc-common", "spring-doc-webflux", "spring-doc-webmvc"]
datasource = ["mysql", "dynamic-datasource"]
dubbo = ["dubbo", "spring-dubbo", "dubbo-nacos", "kotlin-fastjosn2", "satoken-dubbo"]
mybatisplus-generator = ["mybatis-generator", "velocity"]
flowable = ["flowable", "flowable-bpmn-layout"]
## 统一定义插件
[plugins]
springboot = { id = "org.springframework.boot", version.ref = "springboot" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-spring = { id = "org.jetbrains.kotlin.plugin.spring", version.ref = "kotlin" }
docker = { id = "com.bmuschko.docker-spring-boot-application", version.ref = "docker-plugin" }
  1. 在根目录settings.gradle.kts 引入依赖文件,顺便定义全局镜像仓库
import java.net.URI

dependencyResolutionManagement {
    repositories {
        // 使用阿里云 镜像仓库
        maven {url = URI("https://maven.aliyun.com/nexus/content/groups/public/") }
        //私库
        maven { url = URI("xxx") }
        mavenCentral()
    }
    // 统一依赖库定义
    versionCatalogs {
        create("projectLibs"){
            from(files("./libs.versions.toml"))
        }
    }
}
rootProject.name = "project-name"

  1. 在根目录build.gradle.kts配置项目和子模块通用构建配置,直接贴文件内容,有注释说明
import org.apache.tools.ant.filters.ReplaceTokens
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.io.FileInputStream
import java.util.*
// 引入插件
plugins {
    alias(projectLibs.plugins.springboot)
    alias(projectLibs.plugins.kotlin.jvm)
    alias(projectLibs.plugins.kotlin.spring)
    alias(projectLibs.plugins.docker)
}
// 定义库引用
val pLibs = projectLibs
// 加载根路径自定义配置属性   用于替换打包时不同环境的变量值
val envProps = Properties()
envProps.load(FileInputStream("${project.projectDir.absolutePath}${File.separator}env.properties"))
subprojects {
    // 全部项目有基础插件kotlin jvm/spring
    apply {
        plugin(pLibs.plugins.kotlin.jvm.get().pluginId)
        plugin(pLibs.plugins.kotlin.spring.get().pluginId)
    }
    // 统一group和version
    group = "xxx"
    version = pLibs.versions.project.version.get()
    java.sourceCompatibility = JavaVersion.VERSION_17

    dependencies {
        // bom 管理着一组依赖的版本,各模块按需引入其中的依赖即可,由bom统一约束着版本,
        // spring boot bom
        implementation(platform(pLibs.spring.boot))
        // spring cloud bom
        implementation(platform(pLibs.spring.cloud))
        // spring cloud alibaba bom
        implementation(platform(pLibs.spring.cloud.alibaba))
    }
    // 排序logback, 使用log4j2
    configurations.all {
        exclude("org.springframework.boot","spring-boot-starter-logging")
        exclude("ch.qos.logback")
    }
    tasks.withType<KotlinCompile> {
        kotlinOptions {
            freeCompilerArgs = listOf("-Xjsr305=strict", "-Xjvm-default=all")
            jvmTarget = "17"
        }
    }
    tasks.withType<Test> {
        useJUnitPlatform()
    }
    tasks.jar {
        enabled = true
        archiveClassifier.set("")
    }

    // 为拥有bootJar的模块创建dev,test,prod的构建任务
    if (getTasksByName("bootJar", false).isNotEmpty()) {
        println("getTask:::" + getTasksByName("bootJar", false))
        tasks.register<Jar>("bootJar-dev") { buildJarTaskConf(this, "dev") }
        tasks.register<Jar>("bootJar-test") { buildJarTaskConf(this, "test") }
        tasks.register<Jar>("bootJar-prod") { buildJarTaskConf(this, "prod") }

        // docker镜像
        apply {
            plugin(pLibs.plugins.docker.get().pluginId)
        }
        docker {
            // docker镜像仓库配置
            registryCredentials {
                url.set("http://ip:port")
                username.set("username")
                password.set("password")
            }
            springBootApplication {
                baseImage.set("xxxx/java:17-latest")
                images.set(setOf("xxx/$name:$version"))
                jvmArgs.set(listOf("-Dfile.encoding=utf-8"))
            }
        }
        // docker测试环境构建并推送镜像任务
        tasks.register<Jar>("dockerBuildAndPushImage-test") { buildDockerTaskConf(this, "test") }
    }
	
	// 包含有bootjar的模块在processResources 任务阶段替换环境变量
    if (getTasksByName("bootJar", false).isNotEmpty() || project.name == "xxx-module") {
        // 在复制文件任务processResources阶段替换变量
        tasks.processResources {
            doFirst {  // 将逻辑放到执行阶段
                val env = System.getProperty("buildEnv", "dev") // 默认dev环境
                println("===============模块 ${project.name} 替换配置文件环境变量 , 构建环境: $env ==================")
                filter(
                    ReplaceTokens::class,
                    "tokens" to
//							envPropsToMap(env)
                            // todo 写个函数自动读取待替换列表转为map
                            mapOf(
                                "nacos.server" to envProps.getOrElse("env.$env.nacos.server") {
                                    throw IllegalArgumentException(
                                        "未找到环境:$env 属性:nacos.server 的配置"
                                    )
                                },
                                "nacos.namespace" to envProps.getOrElse("env.$env.nacos.namespace") {
                                    throw IllegalArgumentException(
                                        "未找到环境:$env 属性:nacos.namespace 的配置"
                                    )
                                },
                                "nacos.username" to envProps.getOrDefault("env.$env.nacos.username", ""),
                                "nacos.password" to envProps.getOrDefault("env.$env.nacos.password", ""),
                                "active.env" to env
                            )
                )
                filteringCharset = "UTF-8"
            }
        }
        tasks.classes {
            dependsOn("clean")
        }
    }
}
// docker服务地址
docker {
    url.set("tcp://xxx:2375")
}

/**
 * 任务执行顺序说明
 * Task#finalizedBy 函数 的作用是为 Gradle 任务 设置任务执行完毕后执行的任务,A.finalizedBy B 的作用是 A 任务执行完毕后 , 执行 B 任务
 * A.finalizedBy B
 * B.dependsOn C
 * A 执行完毕后执行 B , B 依赖于 C , 执行 B 之前要先把 C 执行了。A -> C -> B
 */
/**
 * 构建各个环境的bootJar
 */
fun buildJarTaskConf(jarTask: Jar, env: String) {
    jarTask.group = "build"
    jarTask.dependsOn("clean")
    jarTask.doFirst {
        println("=============== 构建 ${jarTask.archiveFileName.get()} 包 , 构建环境: $env ==================")
        System.setProperty("buildEnv", env)
    }
    jarTask.finalizedBy("bootJar")
}

fun buildDockerTaskConf(dockerPushImage: Jar, env: String) {
    dockerPushImage.group = "docker"
    dockerPushImage.doFirst {
        System.setProperty("buildEnv", env)
    }
    dockerPushImage.finalizedBy("dockerPushImage")
}

  1. 根目录创建env.properties
## dev
env.dev.nacos.server=xxx:8848
env.dev.nacos.namespace=xxx
env.dev.nacos.username=xx
env.dev.nacos.password=xx
## test
env.test.nacos.server=xxx:8848
env.test.nacos.namespace=xxx
env.test.nacos.username=xx
env.test.nacos.password=xx
## prod
env.prod.nacos.server=xxx:8848
env.prod.nacos.namespace=xxx
env.prod.nacos.username=xxx
env.prod.nacos.password=xxx

  1. 创建Module, 一种是包含springboot启动类的模块, 一种是作为公共定义的模块

gradle 构建spring cloud 微服务工程,spring boot,kotlin,微服务,gradle,java
gradle 构建spring cloud 微服务工程,spring boot,kotlin,微服务,gradle,java
9. 包含springboot启动类的模块的build.gradle.kts文件
gradle 构建spring cloud 微服务工程,spring boot,kotlin,微服务,gradle,java
公共定义的模块的build.gradle.kts文件
gradle 构建spring cloud 微服务工程,spring boot,kotlin,微服务,gradle,java

  1. 在公共定义模块多了的情况,有些模块可能会出现互相依赖,这时候需要解决,解决方式
    1. 尽可能依赖最小模块,比如只引入mybatisplus-coregradle 构建spring cloud 微服务工程,spring boot,kotlin,微服务,gradle,java
    2. 抽取出来作为公共模块
    3. springboot3 自动配置类,将引入模块的配置注入spring
      gradle 构建spring cloud 微服务工程,spring boot,kotlin,微服务,gradle,java

撒花~

补充一个demo工程,不是文中的工程,文中的为微服务,该demo为单一服务 gitee地址文章来源地址https://www.toymoban.com/news/detail-763443.html

到了这里,关于springboot gradle kotlin 多模块(或微服务)统一依赖及版本管理和构建不同环境打包task,docker镜像构建task的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Gradle8.4构建SpringBoot多模块项目

    Gradle8.4构建SpringBoot多模块项目

    这个版本是Jdk8最后一个SpringBoot版本 软件 版本 Gradle 8.4 SpringBoot 2.7.15 JDK 8 2.1、使用Wrapper方式构建 好处:统一gradle的版本 好处:不用安装gradle就可以使用 Maven也是一样的可以用Wrapper的方式 2.2、导包方式 列举常用的四种 ①、implementation 导入依赖, 不传递 给子模块,依赖项将

    2024年02月07日
    浏览(9)
  • 各个微服务模块之间互相依赖调用的问题

    各个微服务模块之间互相依赖调用的问题

    首先是模块之间不能够循环引用,否则会报循环依赖引入的错误。 没有了模块之间的相互依赖,在项目中这两个模块是相互调用的,分别各自定义相应的Feign接口,如下: 最开始写的运行报错的代码如下: 报错信息,如下: 报错的原因是这里定义了两个Feign接口,都是调用

    2024年02月11日
    浏览(10)
  • SpringBoot + Kotlin 中使用 GRPC 进行服务通信

    SpringBoot + Kotlin 中使用 GRPC 进行服务通信

    示例项目见:kotlin-grpc 一、导入依赖: 二、设置Proto 将 proto 文件放在 src/mian/proto 目录下 执行 ./gradlew clean build build成功则会在 build/generated/source/proto/main 下生成对应的 grpc 、 grpckt 、 java 文件 在程序中可以直接导包引入 三、Server端 写一个 service 在 main 入口引入启动 四、Cl

    2024年02月16日
    浏览(14)
  • Kotlin中的Gradle

    Kotlin中的Gradle

    1.创建 左上角【File】-【New Project】-【Project】,出现以下画面,如下勾选 在配置Gradle时,需要连接网络下载资源,不然会出现配置失败的情况。 若在构建完毕后,左侧的路径中没有出现src包,可以在build.gradle文件中最外部添加如下内容(对应的是5.X版本的Gradle): 点击右侧

    2024年02月04日
    浏览(10)
  • Kotlin版本实现Gradle插件

    本文链接:https://blog.csdn.net/feather_wch/article/details/131746478 创建一个Gradle项目,并选择Kotlin/JVM作为项目SDK。假设项目的名称为hello-plugin。 在项目中创建一个新的源集,比如plugin,用于存放插件的源代码和资源。在src目录下创建一个plugin目录,并在其中创建一个kotlin目录和一个

    2024年02月16日
    浏览(11)
  • 【Android Gradle 插件】Android 依赖管理 ① ( 依赖库匹配 | 依赖库查找顺序及路径 | Gradle 资源库 )

    【Android Gradle 插件】Android 依赖管理 ① ( 依赖库匹配 | 依赖库查找顺序及路径 | Gradle 资源库 )

    依赖库匹配 :  依赖库由三部分组成 依赖库分组 依赖库名称 依赖库版本号 只有三者都对上 , 依赖库才能匹配上 , 如 依赖库分组为 androidx.appcompat ,  依赖库名称为 appcompat ,  依赖库版本号为 1.3.1 ,  三者由冒号隔开 ; Android 依赖库查找路径 : 首先 , 查找 本地的 Gradle 缓存依赖

    2024年01月17日
    浏览(15)
  • Springboot 多模块(A依赖B)集成mybatis , mybatis.mapper-locations 配置多个mapper路径配置

    最近在用SpringBoot 多模块 集成mybatis,模块A 依赖于模块B, 模块A 和模块B 各自有各自的业务逻辑和mapper 文件,模块A 的mapper xml 文件存放在resource 下的 mybatisMapper 文件夹,模块B 的mapper xm 文件存放在 B 模块的resource 下的 mapper 文件夹, 打包时以A 模块为主,B 以jar 包方式被A 依赖

    2024年02月03日
    浏览(11)
  • android中gradle的kotlin编译配置选项

    1、Android中的配置 使用如下方式开启在Android中的gradle的kotlin编译配置: 该配置在其余平台不可用 以上配置会开启Kotlin/JVM 的上下文接收者原型功能,否则该功能不可用,开启后编码可以使用以下代码: 传递参数的发过誓可以直接在里面写 setFreeCompilerArgs([\\\"-opt-in=org.mylibrary.

    2024年02月07日
    浏览(12)
  • 如何查看Android 包依赖关系&gradle依赖管理

    如何查看Android 包依赖关系&gradle依赖管理

    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 我们继续总结学习,温故知新。 本文讲述如何查看 android 依赖库关系。 Tasks-help-dependencies 可以看项

    2024年01月18日
    浏览(13)
  • 使用Gradle7.6.1 + SpringBoot3.0.2 + java17创建微服务项目(学习)

    使用Gradle7.6.1 + SpringBoot3.0.2 + java17创建微服务项目(学习)

    这是一个大胆的决定 技术 版本 spring-boot 3.0.2 spring-cloud 2022.0.2 spring-cloud-alibaba 2022.0.0.0-RC2 mybatis-plus-boot-starter 3.5.3.1 mysql-connector-java 8.0.32 技术 版本 java 17 gradle 7.6.1 IDEA 2022.2.4 Nvcat 15 MySQL 8.0.32 打开IDEA创建 SpringBoot项目 删除父项目中的src模块 新建两个子项目(新建时会重新创建

    2024年02月06日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包