Gradle 可以支持多模块(项目)构建。多个模块(项目)之间需要将公用的配置抽取到全局,子项目中只写差异化的配置,以便于维护。
多模块(项目)的 Gradle 目录结构
以项目 search 为示例,需要有一个 search-common 模块用于公用代码,一个 search-rest 模块用于提供 rest 接口,search-rest 依赖 search-common,如果用 gradle 构建,目录树会是如下形式:
search
├── build.gradle -- 全局配置
├── settings.gradle -- 全局配置
├── search-common -- 子模块1目录
│ └── src -- 子模块1 src 目录
│ └── main
│ └── build.gradle -- 子模块1配置
├── search-rest -- 子模块2配置
│ └── src -- 子模块2 src 目录
│ └── main
│ └── build.gradle -- 子模块2配置
...
这种构建有各种形状和大小,但它们都有一些共同的特点:
- 在项目的根目录或主目录中都有一个 settings.gradle 文件。
- 根目录或主目录都有一个 build.gradle 文件。
- 具有自己的 build.gradle 构建文件的子目录(某些多项目构建可能会省略子项目构建脚本)。
全局 Gradle 配置
Gradle 多模块(多项目)的配置文件主要有 3 个:
- settings.gradle 文件配置。
- build.gradle 脚本配置。
- gradle.properties 配置。
settings.gradle 配置
settings.gradle 是 Gradle 构建工具的配置文件之一,用于配置 Gradle 的全局设置以及多项目构建。在该文件中,可以定义项目的名称、子项目、Gradle 插件、Gradle 版本等设置。如果存在多个 Module,可以在此处配置所有的 Module 项目。
settings.gradle 中的结构定义示例如下:
rootProject.name = 'search' -- 根项目名称
include 'search-common' -- 子模块(项目)名称
include 'search-rest' -- 子模块(项目)名称
include ':search-base:es-base' -- 子模块(项目)路径
pluginManagement {
repositories {
gradlePluginPortal()
mavenCentral()
// 其他插件仓库
}
plugins {
id 'com.example.plugin' version '1.0.0'
// 其他插件及其版本
}
}
dependencyResolutionManagement {
repositories {
mavenCentral()
// 其他依赖仓库
}
}
配置项详解:
-
rootProject.name
:设置项目的名称。 -
include
:包含子项目。例如,如果你的子目录有一个名为 app 的子项目,可以使用include ':app'
来包含它。你会发现该配置项值有的存在冒号前缀,有的值不存在冒号,带有冒号的形式表示子项目的路径,而不带冒号的形式表示子项目的名称。冒号是用于指定项目路径的分隔符。例如,如果你有一个多层次的项目结构,你可以使用冒号来指定子项目的路径。这对于组织大型项目或多模块项目非常有用。
如果项目是多层次的,需要使用冒号来指定子项目的路径。
include 命令也可以用逗号隔开一次性指定所有导入模块,如下:
include ':client', ':push', ':uikit', ':mars-core-release', ':webrtc', ':badgeview', ':uvccamera', ':emojilibrary', ':imagepicker', ':pttclient', ':avenginekit'
-
pluginManagement
:该块用于配置和管理插件的版本。允许在项目中的任何位置声明插件及其版本,而不需要在每个子项目中重复声明。
通过这种方式,你可以确保项目中使用的插件版本是一致的,而且可以轻松地对所有插件进行统一的升级或更改。
-
dependencyResolutionManagement
:该块用于配置和管理整个项目的依赖版本。允许中心化管理项目中使用的所有依赖的版本信息,以确保版本的一致性。
可以在这里定义依赖的版本,然后在各个子项目中引用这些版本而无需在每个子项目中单独声明版本。
build.gradle 配置
全局 build.gradle 中可以定义全局公用的构建配置,以 Spring Boot 项目配置示例:
// groovy 脚本本身的依赖配置
buildscript {
// jcenter 仓库、maven 仓库等依赖仓库配置
repositories {
jcenter()
mavenLocal()
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://repo.spring.io/snapshot' }
maven { url 'http://repo.spring.io/milestone' }
mavenCentral()
}
// ext 对象中属性相关配置
ext {
springBootVersion = '2.0.6.RELEASE'
springGradleVersion = '1.0.5.RELEASE'
}
// 依赖组件配置
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath "io.spring.gradle:dependency-management-plugin:${springGradleVersion}"
}
}
// 所有模块(项目)的通用配置
allprojects {
group 'com.demo.search'
version '1.0-SNAPSHOT'
apply plugin: 'idea'
}
// 子模块(项目)的统一配置
subprojects {
apply plugin: 'java'
// 指定 JDK 版本
sourceCompatibility = 1.8
targetCompatibility = 1.8
// 指定编码格式
[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
}
// ext 对象中属性相关配置
ext {
springBootVersion = "2.0.6.RELEASE"
fastjsonVersion = "1.2.54"
}
dependencies {
compile("javax.servlet:javax.servlet-api:4.0.1")
compile("com.alibaba:fastjson:$fastjsonVersion")
// 单元测试
testCompile("org.springframework.boot:spring-boot-starter-test:$springBootVersion")
testCompile("junit:junit:4.12")
}
configurations {
// 移除 spring boot 默认 logger 依赖
all*.exclude module: 'spring-boot-starter-logging'
}
}