系列文章目录

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 的一些经验,干货满满。

  1. 将 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
  1. 新建 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
  1. 将 maven 仓库地址改为国内镜像

  2. 将经常变更的依赖包版本、 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
  1. 指定 JDK 版本和编码。
//指定JDK版本
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8//指定编码格式
[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'
  1. 使用 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'
  1. 新建 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"
  1. 在 build.gradle 里添加引用本地jar包的语句,这样配置后,仓库中没有的jar包,放到 src/libs 文件夹下就可以直接使用了,非常方便。
implementation fileTree(dir: 'src/libs', include: ['*.jar'])
  1. 在 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 工程,而我们要将其改造为一个多模块项目,我的思路是,将项目拆分为多个子模块,分为三类:服务、模块、组件,下面将自顶向下逐一介绍:

  1. 项目:最顶级,与服务是一对多的关系,本项目为yanx根目录;
  2. 服务:对应一个可启动的 SpringBoot 工程,一般只有一个启动类,建议根据服务器资源和团队规模划分,与模块是一对多的关系,位置在 services 包下;
  3. 模块:对应一个完整的业务,模块间边界清晰,将不同的业务解耦,便于扩展和维护,位置在 modules 包下;
  4. 组件:将公用的代码部分提取为一个个组件,供不同的模块调用,与模块是多对多的关系,位置在 components 包下。

举个例子:共有3个业务,但是只有1台服务器,2个开发人员,那么就拆分为1个服务、3个模块;后来其中1个业务的访问量较高,那么就新增1个服务,专门挂载这个业务所在的模块,部署在新申请的服务器上。

4.2. 拆分实践

  1. 服务:目前就本人一个人维护,就一个服务吧:yanx-boot
  2. 模块:只是个框架,没有承载业务,象征性的建一个系统管理模块:yanx-system ,任何系统都能用到;
  3. 组件:建一个放工具类的组件:yanx-common ,所有模块都会用到。

4.3. 具体配置

  1. 声明子模块:在根目录 settings.gradle 里声明各个模块:
rootProject.name = 'yanx'//sdk
include ':components:yanx-common'//业务模块
include ':modules:yanx-system'//聚合服务
include ':services:yanx-boot'
  1. 服务公共依赖:在 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')
}
  1. 服务包含模块:在 services/yanxi-boot/build.gradle 里引用模块 yanxi-system
dependencies {implementation project(':modules:yanx-system')
}
  1. 模块公共依赖:在 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'])}
}
  1. 模块包含组件:在 modules/yanxi-system/build.gradle 里引用组件 yanxi-common
dependencies {implementation project(':components:yanx-common')
}

4.4. 代码结构

每次修改 Gradle 配置后,需要刷新生效(也可改为自动刷新)

看下拆分后的代码结构吧

最后

千里之行,始于足下,终于完成了第一讲,希望能够帮助到大家。项目代码已托管到 Gitee(搜索 yanx ),可自行下载学习,如果大家有什么问题请在下方留言。也可添加公众号,获取最新消息。

01 | 使用Gradle构建多模块项目相关推荐

  1. gradle构建多模块项目_Gradle入门:创建多项目构建

    gradle构建多模块项目 尽管我们可以仅使用一个模块来创建一个运行中的应用程序,但有时将我们的应用程序划分为多个较小的模块是比较明智​​的. 因为这是一个相当普遍的用例,所以每个自重的构建工具都必须 ...

  2. Eclipse Gradle 构建多模块项目

    注意: 1.Eclipse不如IDEA智能,Eclipse建立的Gradle Project项目在目录级别上是同级的; 2.user-web模块如果要引用user-service模块,直接引用是找不到 ...

  3. 在k8s中使用gradle构建java web项目镜像Dockerfile

    在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...

  4. Maven学习总结(八)——使用Maven构建多模块项目

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)--使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分 ...

  5. Maven学习总结(8)——使用Maven构建多模块项目

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)--使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分 ...

  6. 使用maven构建多模块项目

    使用maven构建多模块项目是一种很常见的需求. 如果不使用多模块构建项目,就需要mvn install把每个项目安装到本地maven仓库中,这样每次构建都很复杂. 使用maven构建多模块项目,能够 ...

  7. 基于SpringBoot构建分模块项目

    前言 步骤过于详细,多图慎入!!! 假设一个场景,要开发一个4s店维修部的办公系统,其功能有:前台接待,维修抢单,财务结算,库存管理.于是我们创建一个项目balabalabala写完交工. 一段时间后 ...

  8. 基于gradle构建spring cloud项目

    构建环境 idea:2021.1.2 gradle:4.10.3 项目介绍 gradle-spring-cloud 根项目,用于统一一些公共配置 gradle-eurakeserver 模块使用eur ...

  9. maven 单独构建多模块项目中的单个模块

    最近在公司的一个项目里用到了maven的多模块,由于项目比较大,每次修改后构建整个工程耗时太久,需要单独构建某个模块,mvn有支持的选项: -pl, --projectsBuild specified ...

最新文章

  1. 【yolov4目标检测】(4) opencv+yolov4-tiny 实现选择性目标检测,附python完整代码
  2. Docker网络详解——原理篇
  3. FTP软件VSFTP配置文件详解
  4. Python OpenCV实例:图像直方图均衡化(数学公式简单实现)
  5. 二本本科生连发10篇SCI被喷“灌水严重”?原来是因为......
  6. 02_JNI中Java代码调用C代码,Android中使用log库打印日志,javah命令的使用,Android.mk文件的编写,交叉编译
  7. npoi 设定视图为分页预览_按班级分页打印,只要两步就行,不需要再筛选复制打印了...
  8. chkconfig命令会立即生效吗_UG绘制波纹管,整体变形命令你会用吗?
  9. Spring Cloud部分源码分析Eureka,Ribbon,Feign,Zuul
  10. linux sed 正则转义,Linux运维云升笔记 (一)正则表达式以及文档编辑器sed
  11. JPA简介及其使用详解
  12. fisher精确检验(fisher’s exat test)和超几何分布
  13. 小型数据集卷积神经网络CNN训练策略
  14. 读书笔记——《一个人的朝圣》
  15. 中国移动短信中心服务中心号码一览表
  16. 恶心的八皇后全解python版
  17. 在Windows 10、8、7或Vista上将任何键映射到任何键
  18. 小程序请求后端接口步骤
  19. 酷键盘 Midi Keyboard for Mac - MIDI钢琴键盘模拟器
  20. 【计算机组成原理】计算机系统结构笔记(9):多处理机

热门文章

  1. 完成SL811HS 主控
  2. 【2022-2023】华为ICT大赛实践赛——计算赛道,针对华为认证考取、考试题目类型、电脑端适配等问题问答
  3. CCC认证是什么?是强制认证还是自愿认证?
  4. pytorch实现LSTM学习总结
  5. Reasons to Stay Alive by Matt Haig
  6. 争夺细分新赛道,哪十家企业「领跑」L4级自动驾驶域控制器?
  7. PHP 正则匹配手机号格式
  8. “马云的初恋”创造中国最大的地摊经济!
  9. ORACLE---函数
  10. 探索sandbox进军元宇宙