01 | 使用Gradle构建多模块项目
系列文章目录
01 | 使用Gradle构建多模块项目
02 | 架构师必备 - DDD领域驱动设计之落地实践
03 | 异常处理实践 - 抛异常+错误码
从今天开始,我将从无到有的搭建一套基于 SpringBoot 的开发脚手架,其中包含很多实用的技术和技巧,希望能和大家共同进步。
今天是第1讲:使用 Gradle 构建多模块项目。
0. 前言
本项目基于 SpringBoot 搭建,构建工具使用的是 Gradle ,JDK 版本为8,使用 IDEA(2022.2.3) 进行编码。
1. 创建项目
打开IDEA,选择菜单:File -> New -> Project,选择 Spring Initializr,创建一个全新的项目,这里我将项目起名为 yanx
点击 Next -> Create,之后会成功创建一个新项目,结构如下:
之后,程序会自动下载 Gradle 安装包,并且通过 Gradle 下载和引入的 jar 包。这里我们可以先取消下载,等后面配置好国内镜像后再重新下载,当然也可以慢慢等。
2. Gradle说明
Gradle 的介绍和优缺点我这里就不一一说明了,只说一下本项目涉及的部分:
gradle/wrapper包:Gradle 的一层包装,能够让机器在不安装 Gradle 的情况下运行程序,便于在团队开发过程中统一 Gradle 构建的版本,推荐使用。
gradlew:Gradle 命令的包装,当机器上没有安装 Gradle 时,可以直接用 gradlew 命令来构建项目。
settings.gradle:可以视为多模块项目的总目录, Gradle 通过它来构建各个模块,并组织模块间的关系。
build.gradle:管理依赖包的配置文件(相当于Maven的pom.xml)。
gradle.properties:需手动创建,配置gradle环境变量,或配置自定义变量供 build.gradle 使用。
3. Gradle最佳实践
接下来,讲一下我个人使用 Gradle 的一些经验,干货满满。
- 将 gradle-wrapper.properties 中的 Gradle 下载镜像改为国内地址。
distributionBase= GRADLE_USER_HOME
distributionPath= wrapper/dists
#distributionUrl= https\://services.gradle.org/distributions/gradle-7.5-bin.zip
distributionUrl= https\://mirrors.cloud.tencent.com/gradle/gradle-7.5-bin.zip
zipStoreBase= GRADLE_USER_HOME
zipStorePath= wrapper/dists
- 新建 gradle.properties 文件,配置 Gradle 参数,提升构建速度。
#设置jvm内存大小
org.gradle.jvmargs= -Xmx4g -Xms512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
#开启并行编译任务
org.gradle.parallel= true
#启用新的孵化模式
org.gradle.configureondemand= true
#开启 Gradle 缓存
org.gradle.caching= true
将 maven 仓库地址改为国内镜像
将经常变更的依赖包版本、 maven 库地址等变量提取到 gradle.properties 里, build.gradle 可直接读取使用。
#maven repo url
MAVEN_REPO=https://maven.aliyun.com/repository/public/
#springboot version
VERSION_SPRINGBOOT=2.7.5
#spring plugin version
VERSION_SPRING_PLUGIN=1.0.15.RELEASE
#group
GROUP=com
#version
VERSION=1.0.0
- 指定 JDK 版本和编码。
//指定JDK版本
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8//指定编码格式
[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'
- 使用 buildscript 方式引用 gradle plugins ,优点是可以使用自定义仓库,且便于子模块继承。
buildscript {repositories {maven {allowInsecureProtocol = trueurl MAVEN_REPO}mavenCentral()}dependencies {classpath 'org.springframework.boot:spring-boot-gradle-plugin:' + VERSION_SPRINGBOOTclasspath 'io.spring.gradle:dependency-management-plugin:' + VERSION_SPRING_PLUGIN}
}//gradle插件
apply plugin: 'idea'
apply plugin: 'java-library'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
- 新建 spring.gradle 配置文件,引用相关的 Spring 依赖包。
ext {springBootJars = ['org.springframework.boot:spring-boot-starter-web','org.springframework.boot:spring-boot-starter-actuator','org.springframework.boot:spring-boot-starter-cache','org.springframework.boot:spring-boot-starter-validation','org.springframework.boot:spring-boot-starter-aop',]
}
//在build.gradle里引用
apply from: "${rootDir}/spring.gradle"
- 在 build.gradle 里添加引用本地jar包的语句,这样配置后,仓库中没有的jar包,放到 src/libs 文件夹下就可以直接使用了,非常方便。
implementation fileTree(dir: 'src/libs', include: ['*.jar'])
- 在 build.gradle 中添加一个拷贝 jar 包的 task ,在 build 或 bootJar 后执行,用于将子模块打包后,拷贝到根目录下。
task copyJars(type: Copy) {from 'build/libs'into rootProject.projectDir.absolutePath + '/build/libs'
}
bootJar.finalizedBy copyJars
copyJars.mustRunAfter bootJar
4. 项目模块划分
4.1. 拆分思路
新建的项目是一个单独的 SpringBoot 工程,而我们要将其改造为一个多模块项目,我的思路是,将项目拆分为多个子模块,分为三类:服务、模块、组件,下面将自顶向下逐一介绍:
- 项目:最顶级,与服务是一对多的关系,本项目为yanx根目录;
- 服务:对应一个可启动的 SpringBoot 工程,一般只有一个启动类,建议根据服务器资源和团队规模划分,与模块是一对多的关系,位置在 services 包下;
- 模块:对应一个完整的业务,模块间边界清晰,将不同的业务解耦,便于扩展和维护,位置在 modules 包下;
- 组件:将公用的代码部分提取为一个个组件,供不同的模块调用,与模块是多对多的关系,位置在 components 包下。
举个例子:共有3个业务,但是只有1台服务器,2个开发人员,那么就拆分为1个服务、3个模块;后来其中1个业务的访问量较高,那么就新增1个服务,专门挂载这个业务所在的模块,部署在新申请的服务器上。
4.2. 拆分实践
- 服务:目前就本人一个人维护,就一个服务吧:yanx-boot
- 模块:只是个框架,没有承载业务,象征性的建一个系统管理模块:yanx-system ,任何系统都能用到;
- 组件:建一个放工具类的组件:yanx-common ,所有模块都会用到。
4.3. 具体配置
- 声明子模块:在根目录 settings.gradle 里声明各个模块:
rootProject.name = 'yanx'//sdk
include ':components:yanx-common'//业务模块
include ':modules:yanx-system'//聚合服务
include ':services:yanx-boot'
- 服务公共依赖:在 services/build.gradle 里引用一些所有服务公用的一些依赖包,需要使用 subprojects,表示应用于所有 services 包下的子模块,这里我们通过 sourceSet 的方式将根目录 src 下的文件,作为公共代码集成到每个服务中。
subprojects {sourceSets.main.java.srcDirs(rootProject.projectDir.absolutePath + '/src/main/java')sourceSets.main.resources.srcDirs(rootProject.projectDir.absolutePath + '/src/main/resources')
}
- 服务包含模块:在 services/yanxi-boot/build.gradle 里引用模块 yanxi-system
dependencies {implementation project(':modules:yanx-system')
}
- 模块公共依赖:在 modules/build.gradle 里引用一些所有模块公用的一些依赖包,需要使用 subprojects ,表示应用于所有 modules 包下的子模块,这里我们引用本地 src/libs 文件夹下的本地jar包。
subprojects {dependencies {implementation fileTree(dir: rootProject.projectDir.absolutePath + '/src/libs', include: ['*.jar'])implementation fileTree(dir: 'src/libs', include: ['*.jar'])}
}
- 模块包含组件:在 modules/yanxi-system/build.gradle 里引用组件 yanxi-common
dependencies {implementation project(':components:yanx-common')
}
4.4. 代码结构
每次修改 Gradle 配置后,需要刷新生效(也可改为自动刷新)
看下拆分后的代码结构吧
最后
千里之行,始于足下,终于完成了第一讲,希望能够帮助到大家。项目代码已托管到 Gitee(搜索 yanx ),可自行下载学习,如果大家有什么问题请在下方留言。也可添加公众号,获取最新消息。
01 | 使用Gradle构建多模块项目相关推荐
- gradle构建多模块项目_Gradle入门:创建多项目构建
gradle构建多模块项目 尽管我们可以仅使用一个模块来创建一个运行中的应用程序,但有时将我们的应用程序划分为多个较小的模块是比较明智的. 因为这是一个相当普遍的用例,所以每个自重的构建工具都必须 ...
- Eclipse Gradle 构建多模块项目
注意: 1.Eclipse不如IDEA智能,Eclipse建立的Gradle Project项目在目录级别上是同级的; 2.user-web模块如果要引用user-service模块,直接引用是找不到 ...
- 在k8s中使用gradle构建java web项目镜像Dockerfile
在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...
- Maven学习总结(八)——使用Maven构建多模块项目
2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)--使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分 ...
- Maven学习总结(8)——使用Maven构建多模块项目
2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)--使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分 ...
- 使用maven构建多模块项目
使用maven构建多模块项目是一种很常见的需求. 如果不使用多模块构建项目,就需要mvn install把每个项目安装到本地maven仓库中,这样每次构建都很复杂. 使用maven构建多模块项目,能够 ...
- 基于SpringBoot构建分模块项目
前言 步骤过于详细,多图慎入!!! 假设一个场景,要开发一个4s店维修部的办公系统,其功能有:前台接待,维修抢单,财务结算,库存管理.于是我们创建一个项目balabalabala写完交工. 一段时间后 ...
- 基于gradle构建spring cloud项目
构建环境 idea:2021.1.2 gradle:4.10.3 项目介绍 gradle-spring-cloud 根项目,用于统一一些公共配置 gradle-eurakeserver 模块使用eur ...
- maven 单独构建多模块项目中的单个模块
最近在公司的一个项目里用到了maven的多模块,由于项目比较大,每次修改后构建整个工程耗时太久,需要单独构建某个模块,mvn有支持的选项: -pl, --projectsBuild specified ...
最新文章
- 【yolov4目标检测】(4) opencv+yolov4-tiny 实现选择性目标检测,附python完整代码
- Docker网络详解——原理篇
- FTP软件VSFTP配置文件详解
- Python OpenCV实例:图像直方图均衡化(数学公式简单实现)
- 二本本科生连发10篇SCI被喷“灌水严重”?原来是因为......
- 02_JNI中Java代码调用C代码,Android中使用log库打印日志,javah命令的使用,Android.mk文件的编写,交叉编译
- npoi 设定视图为分页预览_按班级分页打印,只要两步就行,不需要再筛选复制打印了...
- chkconfig命令会立即生效吗_UG绘制波纹管,整体变形命令你会用吗?
- Spring Cloud部分源码分析Eureka,Ribbon,Feign,Zuul
- linux sed 正则转义,Linux运维云升笔记 (一)正则表达式以及文档编辑器sed
- JPA简介及其使用详解
- fisher精确检验(fisher’s exat test)和超几何分布
- 小型数据集卷积神经网络CNN训练策略
- 读书笔记——《一个人的朝圣》
- 中国移动短信中心服务中心号码一览表
- 恶心的八皇后全解python版
- 在Windows 10、8、7或Vista上将任何键映射到任何键
- 小程序请求后端接口步骤
- 酷键盘 Midi Keyboard for Mac - MIDI钢琴键盘模拟器
- 【计算机组成原理】计算机系统结构笔记(9):多处理机