使用Gradle构建多模块项目 - 2022-12-30已发

哈喽,大家好,我是指北君。

今天和大家分享一下使用 Gradle 构建多模块项目。


0. 前言

本项目基于 SpringBoot 搭建,构建工具使用的是 Gradle ,JDK 版本为8,使用 IDEA(2022.3.1) 进行编码。

1. 创建项目

打开IDEA,选择菜单:File -> New -> Project,选择 Spring Initializr,创建一个全新的项目。

点击 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 下载镜像改为国内地址。

  1. 新建 gradle.properties 文件,配置 Gradle 参数,提升构建速度。

  1. 将 maven 仓库地址改为国内镜像

  2. 将经常变更的依赖包版本、 maven 库地址等变量提取到 gradle.properties 里, build.gradle 可直接读取使用。

  1. 指定 JDK 版本和编码。

  1. 使用 buildscript 方式引用 gradle plugins ,优点是可以使用自定义仓库,且便于子模块继承。

  1. 新建 spring.gradle 配置文件,引用相关的 Spring 依赖包。

  1. 在 build.gradle 里添加引用本地jar包的语句,这样配置后,仓库中没有的jar包,放到 src/libs 文件夹下就可以直接使用了,非常方便。

  1. 在 build.gradle 中添加一个拷贝 jar 包的 task ,在 build 或 bootJar 后执行,用于将子模块打包后,拷贝到根目录下。

4. 项目模块划分

4.1. 拆分思路

新建的项目是一个单独的 SpringBoot 工程,而我们要将其改造为一个多模块项目,我的思路是,将项目拆分为多个子模块,分为三类:服务、模块、组件,下面将自顶向下逐一介绍:

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

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

4.2. 拆分实践

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

4.3. 具体配置

  1. 声明子模块:在根目录 settings.gradle 里声明各个模块:

  1. 服务公共依赖:在 services/build.gradle 里引用一些所有服务公用的一些依赖包,需要使用 subprojects,表示应用于所有 services 包下的子模块,这里我们通过 sourceSet 的方式将根目录 src 下的文件,作为公共代码集成到每个服务中。

  1. 服务包含模块:在 services/demo-boot/build.gradle 里引用模块 demo-system

  1. 模块公共依赖:在 modules/build.gradle 里引用一些所有模块公用的一些依赖包,需要使用 subprojects ,表示应用于所有 modules 包下的子模块,这里我们引用本地 src/libs 文件夹下的本地jar包。

  1. 模块包含组件:在 modules/demo-system/build.gradle 里引用组件 demo-common

4.4. 代码结构

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

写在最后

时隔2个月,某鱼群再次限时开放了。

Java技术指北读者交流群,(聊天学习摸鱼,白嫖技术课程为主),又不定时开放了,有一群有趣有料的小伙伴在等你哦!进群方式:公众号后台回复 666

Java Geek Tech wechat
欢迎订阅 Java 技术指北,这里分享关于 Java 的一切。