0. 前言相比起 maven 的 xml 配置方式,gradle 提供了一套简明的 dsl 用于构建java 项目,使我们就像编写程序一样编写项目构建脚本。
本文将从无到有创建一个用 gradle 构建的多模块 spring boot 项目,jdk 版本为8,idea 版本为 2022.3.1 。
1. 创建项目打开idea,选择菜单:file -> new -> project,在其中找到 spring initializr,创建一个全新的 demo 项目,创建成功后结构如下:
之后,程序会自动下载 gradle 安装包,并且通过 gradle 下载和引入的 jar 包。由于默认使用的镜像速度较慢,我们可以先取消下载,等后面配置好国内镜像后再重新下载,当然也可以慢慢等。
2. gradle说明在这里就不介绍gradle 的优缺点了,只说一下本项目涉及的部分:
build.gradle :管理依赖包的配置文件(相当于maven的pom.xml)。gradlew :gradle 命令的包装,当机器上没有安装 gradle 时,可以直接用 gradlew 命令来构建项目。settings.gradle :可以视为多模块项目的总目录, gradle 通过它来构建各个模块,并组织模块间的关系。gradle/wrapper包 :gradle 的一层包装,能够让机器在不安装 gradle 的情况下运行程序,便于在团队开发过程中统一 gradle 构建的版本, 推荐使用 。gradle.properties :需手动创建,配置gradle环境变量,或配置自定义变量供 build.gradle 使用。3. gradle最佳实践接下来,讲一下我个人使用 gradle 的一些经验。
修改 gradle-wrapper.properties 中的 gradle 下载镜像改为国内镜像。
新建 gradle.properties 文件,配置 gradle 参数,提升构建速度。
将 maven 仓库地址改为国内地址将经常变更的依赖包版本、 maven 库地址等变量提取到 gradle.properties 里, build.gradle 可直接读取使用。
使用 buildscript 方式引用 gradle plugins ,优点是可以使用自定义仓库,且便于子模块继承。
新建 spring.gradle 配置文件,引用相关的 spring 依赖包。
在 build.gradle 里添加引用本地jar包的语句,这样配置后,仓库中没有的jar包,放到 src/libs 文件夹下就可以直接使用了,非常方便。
在 build.gradle 中添加一个拷贝 jar 包的 task ,在 build 或 bootjar 后执行,用于将子模块打包后,拷贝到根目录下。
4. 项目模块划分4.1. 拆分思路新项目默认是一个单模块的 springboot 工程,而我们要将其改造为一个多模块项目,思路是,将项目拆分为多个子模块,分为三类: 服务、模块、组件 :
项目 :最顶级,与服务是一对多的关系,本项目为根目录;服务 :对应一个可启动的 springboot 工程,一般只有一个启动类,建议根据服务器资源和团队规模划分,与模块是一对多的关系,位置在 services 包下;模块 :对应一个完整的业务,模块间边界清晰,将不同的业务解耦,便于扩展和维护,位置在 modules 包下;组件 :将公用的代码部分提取为一个个组件,供不同的模块调用,与模块是多对多的关系,位置在 components 包下。4.2. 拆分实践服务 :创建一个示例服务:demo-boot模块 :只是个框架,没有承载业务,象征性的建一个系统管理模块:demo-system ,任何系统都能用到;组件 :建一个放工具类的组件:demo-common ,所有模块都会用到。4.3. 具体配置声明子模块 :在根目录下的 settings.gradle 里声明各个模块:
服务公共依赖 :在 services/build.gradle 里引用一些所有服务公用的一些依赖包,这里使用了 subprojects,表示应用于所有 services 包下的子模块,我们通过 sourceset 的方式将根目录 src 下的文件,作为公共代码集成到每个服务中。
服务包含模块 :在 services/demo-boot/build.gradle 里引用模块 demo-system
模块公共依赖 :在 modules/build.gradle 里引用一些所有模块公用的一些依赖包,这里我们引用本地 src/libs 文件夹下的本地jar包。
模块包含组件 :在 modules/demo-system/build.gradle 里引用组件 demo-common
4.4. 代码结构每次修改 gradle 配置后,需要刷新生效(可改为自动)
小米6什么时候上市?小米6最新消息:小米6配置价格已定!虹膜+超声波+曲面!还会是熟悉的1999元吗?
做短视频的人都在用,aigo国民好物移动固态硬盘 S7 Pro
智嵌物联ZQWL工业以太网交换机POE供电介绍
Profibus-DP转modbus RTU网关modbus rtu可以用网口吗
请注意!这些都是国内主流的可视化工具
Gradle构建的多模块Spring Boot项目
人体红外测温仪的优势_人体红外测温仪的辐射定律
反馈控制的优缺点有哪些
比亚迪的铁电池有什么优点?
iOS 11.4更新主要带来了AirPlay 2和Messages in iCloud功能
电渣压力焊常见缺陷
AK5373带USB 2.0接口立体声模数转换技术
PCB接口接口公母之分:公头和母头的接法
摩尔定律终结了吗_摩尔定律或在2021终结
互联网大幅度降价与5G流量的成本关联
智能家居的问题在于物联网协议的碎片化
运算发大器的的带宽与压摆率的概念及特点介绍
慕尼黑电子展:各大半导体公司助力车联网
常见抗锯齿SSAA、MSAA、CSAA、HRA等介绍
摩尔线程与浙江华数签署战略协议 助力智慧浙江和数字家庭的实现