系列文章目录
01 | 使用Gradle构建多模块项目
02 | 架构师必备 - DDD领域驱动设计之落地实践
03 | 异常处理实践 - 抛异常+错误码
从今天开始,我将从无到有的搭建一套基于 SpringBoot 的开发脚手架,其中包含很多实用的技术和技巧,希望能和大家共同进步。
今天是第1讲:使用 Gradle 构建多模块项目。
本项目基于 SpringBoot 搭建,构建工具使用的是 Gradle ,JDK 版本为8,使用 IDEA(2022.2.3) 进行编码。
打开IDEA,选择菜单:File -> New -> Project,选择 Spring Initializr,创建一个全新的项目,这里我将项目起名为 yanx
点击 Next -> Create,之后会成功创建一个新项目,结构如下:
之后,程序会自动下载 Gradle 安装包,并且通过 Gradle 下载和引入的 jar 包。这里我们可以先取消下载,等后面配置好国内镜像后再重新下载,当然也可以慢慢等。
Gradle 的介绍和优缺点我这里就不一一说明了,只说一下本项目涉及的部分:
gradle/wrapper包:Gradle 的一层包装,能够让机器在不安装 Gradle 的情况下运行程序,便于在团队开发过程中统一 Gradle 构建的版本,推荐使用。
gradlew:Gradle 命令的包装,当机器上没有安装 Gradle 时,可以直接用 gradlew 命令来构建项目。
settings.gradle:可以视为多模块项目的总目录, Gradle 通过它来构建各个模块,并组织模块间的关系。
build.gradle:管理依赖包的配置文件(相当于Maven的pom.xml)。
gradle.properties:需手动创建,配置gradle环境变量,或配置自定义变量供 build.gradle 使用。
接下来,讲一下我个人使用 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
#设置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版本
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
//指定编码格式
[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'
buildscript {
repositories {
maven {
allowInsecureProtocol = true
url MAVEN_REPO
}
mavenCentral()
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:' + VERSION_SPRINGBOOT
classpath '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'
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"
implementation fileTree(dir: 'src/libs', include: ['*.jar'])
task copyJars(type: Copy) {
from 'build/libs'
into rootProject.projectDir.absolutePath + '/build/libs'
}
bootJar.finalizedBy copyJars
copyJars.mustRunAfter bootJar
新建的项目是一个单独的 SpringBoot 工程,而我们要将其改造为一个多模块项目,我的思路是,将项目拆分为多个子模块,分为三类:服务、模块、组件,下面将自顶向下逐一介绍:
举个例子:共有3个业务,但是只有1台服务器,2个开发人员,那么就拆分为1个服务、3个模块;后来其中1个业务的访问量较高,那么就新增1个服务,专门挂载这个业务所在的模块,部署在新申请的服务器上。
rootProject.name = 'yanx'
//sdk
include ':components:yanx-common'
//业务模块
include ':modules:yanx-system'
//聚合服务
include ':services:yanx-boot'
subprojects {
sourceSets.main.java.srcDirs(rootProject.projectDir.absolutePath + '/src/main/java')
sourceSets.main.resources.srcDirs(rootProject.projectDir.absolutePath + '/src/main/resources')
}
dependencies {
implementation project(':modules:yanx-system')
}
subprojects {
dependencies {
implementation fileTree(dir: rootProject.projectDir.absolutePath + '/src/libs', include: ['*.jar'])
implementation fileTree(dir: 'src/libs', include: ['*.jar'])
}
}
dependencies {
implementation project(':components:yanx-common')
}
每次修改 Gradle 配置后,需要刷新生效(也可改为自动刷新)
看下拆分后的代码结构吧
千里之行,始于足下,终于完成了第一讲,希望能够帮助到大家。项目代码已托管到 Gitee(搜索 yanx ),可自行下载学习,如果大家有什么问题请在下方留言。也可添加公众号,获取最新消息。