基础环境

下载gradle

https://gradle.org/releases/

解压到磁盘

配置环境变量

  1. GRADLE_HOME(MAVEN_HOME) D:\dev\gradle-7.4
  2. PATH %GRADLE_HOME%\bin
  3. GRADLE_USER_HOME(maven本地仓库位置) D:\dev\gradle-7.4\gradle_repository 相当于是配置Gradle 本地仓库位置和 Gradle Wrapper 缓存目录。

配置下载加速

Gradle还是从maven仓库下载的,给gradle安装目录下init.d文件夹,放一个init.gradle文件,即可进行加速下载。内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
gradle.projectsLoaded {
rootProject.allprojects {
buildscript {
repositories {
def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter'
def GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
def NEXUS_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
all { ArtifactRepository repo ->
if (repo instanceof MavenArtifactRepository) {
def url = repo.url.toString()
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL."
println("buildscript ${repo.url} replaced by $JCENTER_URL.")
remove repo
}
else if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL."
println("buildscript ${repo.url} replaced by $GOOGLE_URL.")
remove repo
}
else if (url.startsWith('https://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
println("buildscript ${repo.url} replaced by $REPOSITORY_URL.")
remove repo
}
}
}
jcenter {
url JCENTER_URL
}
google {
url GOOGLE_URL
}
maven {
url NEXUS_URL
}
}
}
repositories {
def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter'
def GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
def NEXUS_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
all { ArtifactRepository repo ->
if (repo instanceof MavenArtifactRepository) {
def url = repo.url.toString()
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL."
println("buildscript ${repo.url} replaced by $JCENTER_URL.")
remove repo
}
else if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL."
println("buildscript ${repo.url} replaced by $GOOGLE_URL.")
remove repo
}
else if (url.startsWith('https://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
println("buildscript ${repo.url} replaced by $REPOSITORY_URL.")
remove repo
}
}
}
jcenter {
url JCENTER_URL
}
google {
url GOOGLE_URL
}
maven {
url NEXUS_URL
}
}
}
}

Gradle项目说明

项目结构

  • src/main/java - 文件夹包含所有java源文件。

  • src/test/java - 文件夹包含所有java测试用例。

  • build.gradle :管理依赖包的配置文件(相当于Maven的pom.xml)。

  • settings.gradle :可以视为多模块项目的总目录, Gradle 通过它来构建各个模块,并组织模块间的关系。

  • gradlew :Gradle 命令的包装,当机器上没有安装 Gradle 时,可以直接用 gradlew 命令来构建项目。

  • gradle/wrapper包 :Gradle 的一层包装,能够让机器在不安装 Gradle 的情况下运行程序,便于在团队开发过程中统一 Gradle 构建的版本, 推荐使用

  • gradle.properties :需手动创建,配置gradle环境变量,或配置自定义变量供 build.gradle 使用。

导包方式

①、implementation

  • 导入依赖,不传递给子模块,依赖项将被编译和打包到项目中

②、api

  • 导入依赖,传递给子模块,依赖项将被编译和打包到项目中

③、implementation和api的区别

④、compileOnly

  • 导入依赖,不传递给子模块,依赖项将被编译到项目中,不打包到项目

⑤、compileOnlyApi

  • 导入依赖,传递给子模块,依赖项将被编译到项目中,不打包到项目

build.gradle配置文件

  • 相当于Maven的pom文件,主要是配置模块,导入依赖的作用

①、allprojects

  • 里面的配置,所有模块生效
  • 一般配置包的信息、编码、仓库地址
1
2
3
allprojects {

}

②、subprojects

  • 里面的配置,只有自己和子模块生效
  • 一般配置插件、统一包的版本管理、打包方式等等
1
2
3
subprojects {

}

③、dependencies

  • 导入依赖,相当于Maven的<dependency></dependency> 导包
  • 引入依赖演示
1
2
3
4
5
dependencies {
// api可以传递依赖、implementation不能传递依赖
// hutool工具类
api 'cn.hutool:hutool-all'
}
  • 引入模块演示
1
2
3
4
5
dependencies {
//依赖公共模块
api project(":模块地址")
implementation project(":GradleParent:GradleUtil")
}

settings.gradle配置文件

  • 配置模块间的信息,见后面具体实现

实战

项目结构

1
2
3
4
5
6
7
8
-GradleMultiModule
-GradleParent 包装common、util的父模块(实际中可以不要,这里演示导包、传递依赖等)
-GradleCommon 公共模块,用于装entity或者mapper等
-GradleUtil 工具类模块
-GradleServer 业务模块的父模块,用于给子模块统一导入springboot的包
-GradleOne 业务模块1 - 依赖GradleCommon、GradleUtil
-GradleTwo 业务模块2 - 依赖
-GradleStart 启动模块 - 导入GradleOne、GradleTwo依赖,启动项目

新建模块

  • 就是用idea创建springboot的gradle项目

各个模块的配置及类

GradleMultiModule模块

  • 顶级父模块

  • 统一配置 build.gradle (还可以配置gradle的版本)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    //插件
    plugins {
    id 'java'
    id 'idea'
    id 'java-library'
    id 'org.springframework.boot' version '2.7.15'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    }

    //allprojects:所有模块生效
    allprojects {
    // 配置项目信息
    group = 'com.cc'
    version = '0.0.1-SNAPSHOT'
    // 配置字符编码
    tasks.withType(JavaCompile).configureEach {
    options.encoding = 'UTF-8'
    }

    java {
    sourceCompatibility = '8'
    targetCompatibility = '8'
    }

    //仓库配置
    repositories {
    //本地
    mavenLocal()
    //阿里仓库
    maven { url 'https://maven.aliyun.com/repository/public/' }
    //公司仓库。必须用:https。Gradle默认情况下不允许使用不安全的协议,以提高安全性。
    maven { url 'https://******:****/repository/maven-public/' }
    //中央仓库
    mavenCentral()
    }

    }

    //subprojects:所有子模块生效——springboot配置、导包版本管理、打包管理
    subprojects {
    apply plugin: 'java'
    apply plugin: 'java-library'
    apply plugin: 'idea'
    //所有子模块都是springboot项目,如不是,不能打包。
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    //所有子模块的-依赖版本管理
    dependencyManagement {
    dependencies {
    dependency 'cn.hutool:hutool-all:5.0.7'
    dependency "org.apache.commons:commons-lang3:3.5"
    }
    }

    //使用 gradle打包工具
    jar {
    manifest.attributes provider: 'gradle'
    }

    tasks.named('test') {
    useJUnitPlatform()
    }

    }

    // 配置gradle的版本
    wrapper {
    //gradle的版本
    gradleVersion = '7.4'
    //版本类型:BIN、ALL(完全版,可以看gradle的代码)
    distributionType = 'ALL'
    }
  • 配置所有模块的关系 settings.gradle

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    rootProject.name = 'GradleMultiModule'

    //公共模块总模块
    include 'GradleParent'
    include ':GradleParent:GradleCommon'
    include ':GradleParent:GradleUtil'
    project(':GradleParent:GradleCommon')?.name = 'GradleCommon'
    project(':GradleParent:GradleUtil')?.name = 'GradleUtil'

    //业务模块总模块
    include 'GradleServer'
    include ':GradleServer:GradleStart'
    include ':GradleServer:GradleOne'
    include ':GradleServer:GradleTwo'
    project(':GradleServer:GradleStart')?.name = 'GradleStart'
    project(':GradleServer:GradleOne')?.name = 'GradleOne'
    project(':GradleServer:GradleTwo')?.name = 'GradleTwo'

GradleParent模块(公共)

  • 统一公共模块依赖

  • build.gradle

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //配置所有子模块
    subprojects {
    //这里可以导入公共的依赖
    dependencies {
    // compileOnly:这样做可以确保Lombok在编译时可用,但不会包含在最终的构建产物中,从而减小构建产物的大小。
    // api:依赖可以传递给子模块
    // compileOnlyApi:仅编译时可用,不包含在构建产物中,并且可以传递给子模块
    compileOnlyApi 'org.projectlombok:lombok'
    // 表示将Lombok库作为注解处理器导入。
    annotationProcessor 'org.projectlombok:lombok'
    }
    }

GradleCommon模块(公共)

  • 公共模块,存放Entity

  • build.gradle

    1
    2
    3
    4
    5
    dependencies {
    // api可以传递依赖、implementation不能传递依赖
    // hutool工具类
    api 'cn.hutool:hutool-all'
    }

GradleUtil模块(公共)

  • 存放所有工具类

  • build.gradle

    1
    2
    3
    4
    dependencies {
    // api可以传递依赖、implementation不能传递依赖
    api 'org.apache.commons:commons-lang3'
    }

GradleServer模块(业务)

  • 业务模块的父模块,用于统一导入springboot的包

  • build.gradle

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 子模块生效
    subprojects {
    //配置子模块依赖
    dependencies {
    //导入业务模块的公共包 - SpringBoot的包
    //不用api,不用传递
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
    }

GradleOne模块(业务)

  • 引入:GradleCommon、GradleUtil模块

  • 测试是否能使用引入模块的类、引入模块的依赖

  • build.gradle

    1
    2
    3
    4
    5
    6
    dependencies {
    //依赖公共模块
    //api传递给子模块
    api project(":GradleParent:GradleCommon")
    api project(":GradleParent:GradleUtil")
    }

GradleTwo模块(业务)

  • 引入:GradleCommon、GradleUtil模块

  • 测试是否能使用引入模块的类、引入模块的依赖

  • build.gradle

    1
    2
    3
    4
    5
    6
    dependencies {
    //依赖公共模块:implementation不传递依赖;api传递依赖
    //这里不传递依赖,因为会造成GradleStart有多个重复依赖
    implementation project(":GradleParent:GradleCommon")
    implementation project(":GradleParent:GradleUtil")
    }

GradleStart启动模块(业务)

  • 启动springboot项目

  • 引入所有业务模块

  • 配置SpringMVc

  • 此模块不写任何的业务

  • build.gradle

    1
    2
    3
    4
    5
    6
    7
    dependencies {
    // 依赖GradleOne、GradleTwo,将该模块纳入启动中(加入springboot项目中)
    api project(':GradleServer:GradleOne')
    api project(':GradleServer:GradleTwo')

    // 其他依赖项...
    }

简单SpringBoot

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
plugins {
id 'java'
id 'idea'
//所有子模块都是springboot项目,如不是,不能打包。
id 'org.springframework.boot' version('2.2.2.RELEASE')
id 'io.spring.dependency-management' version('1.0.15.RELEASE')
}

group = 'pers.fulsun'
version = '1.0-SNAPSHOT'

dependencies {
//导入业务模块的公共包 - SpringBoot的包
//不用api,不用传递
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// compileOnlyApi:仅编译时可用,不包含在构建产物中,并且可以传递给子模块
compileOnly('org.projectlombok:lombok')
annotationProcessor 'org.projectlombok:lombok'
}


//allprojects:所有模块生效
allprojects {
// 配置项目信息
group = 'com.cc'
version = '0.0.1-SNAPSHOT'
// 配置字符编码
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
}

java {
sourceCompatibility = '8'
targetCompatibility = '8'
}

//仓库配置
repositories {
//本地
mavenLocal()
//阿里仓库
maven { url 'https://maven.aliyun.com/repository/public/' }
//公司仓库。必须用:https。Gradle默认情况下不允许使用不安全的协议,以提高安全性。
maven { url 'https://******:****/repository/maven-public/' }
//中央仓库
mavenCentral()
}

}