文章目录
一、初识gradle
1.1 gradle 是什么
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。Gradle 构建脚本使用的是Groovy 或 Kotlin 的特定领域语言来编写的,而不是传统的XML。
1.2 gradle 基本语法
使用Groovy语言编写Gradle构建脚本时,我们需要掌握一定的语法。
- Groovy代码行都可以省略分号;
println("hello groovy!")
- Groovy类默认带有具名构造器 key:value,其中key为类中的定义的属性名;
// 定义一个学生类
class Stu {
// 定义属性,省略分号
private String username
private String email
int age
// 省略return
String getUsername() {
username
}
void setUsername(String username) {
this.username = username
}
}
// 在groovy脚本中使用类
// 通过json调用具名构造器
Stu stu = new Stu(username: "tom", email: "tom@qq.com", age: 20)
println stu.username + "-" + stu.email + "-" + stu.age // 输出:tom-tom@qq.com-20
- Groovy除了支持Java语言本身的数据类型,还提供了
def
关键字定义弱类型属性;
def str='text'
println(str) // 输出:text
- Groovy调用有参函数时可以省略括号;
println "hello groovy"
// 等价于 println("hello groovy")
- Groovy支持
'
、"
、'''
三种引号形式定义字符串,在双引号("
)字符串中可以通过${var}
的方式引用其他变量的值,而三引号('''
)字符串则会保留引号内文本原有的格式输出;
def s1 = 'tom'
def s2 = "hello ${s1}" // s2引用了变量s1的值
println s2 // 输出:hello tom
def s3 = '''
这是缩进行
空两个
'''
println s3 // 会原样输出文本
- Groovy引入了闭包类(
Closure
),且闭包类常被用于函数参数传递。闭包其实由{}
包围起来的代码块。
// 定义一个闭包
def c1 = {
println "hello c1"
}
// 执行闭包
// c1 其实是 Closure 类型
c1()
// 另一种方式去执行
c1.call()
// 定义带参数的闭包
def c2 = {
name ->
println "hello ${name}"
}
// 执行闭包
c2 "tom"
二、gradle 配置镜像仓库
2.1 配置仓库镜像地址
gradle并不像maven一样,拥有全局的配置文件(setting.xml
),所以gradle配置镜像仓库只需要在项目对应的build.gradle
文件中,添加如下配置:
// 下面类似代码在gradle中随处可见,都是将闭包传给对应的函数
repositories {
// 会按照配置的仓库地址顺序依次去下载依赖
// 配置私服地址
maven {
url 'http://localhost:18081/repository/maven-public/'
}
// 配置阿里云镜像地址
maven {
url 'https://maven.aliyun.com/repository/public'
}
// 配置maven中央仓库
mavenCentral()
}
2.2 本地类库deploy到nexus
gradle像maven一样,也支持将本地类库deploy到私服上,供其他项目引用。只需要在项目的build.gradle
文件中添加进行如下配置(此处以本地的studentsystem
项目为例进行演示,后面综合实战会详细讲解该项目的各个模块信息):
// 项目信息配置
group = 'com.len.studentsystem'
version = '1.0-SNAPSHOT'
// 插件配置
apply plugin: 'java'
// 引入maven发布相关插件
apply plugin: 'maven-publish'
// 仓库镜像配置
repositories {
// 阿里云镜像
maven {
url "https://maven.aliyun.com/repository/public"
}
// maven 中央仓库
mavenCentral()
}
// 配置项目发布信息
publishing {
// 配置发布相关task
publications {
// lenPublish 为自定义名称,可写多个发布任务
lenPublish(MavenPublication){
// 发布jar包
from components.java
// 发布war包
// from components.war
}
}
// 配置项目发布地址
repositories {
maven {
// 配置允许http不安全连接,不然执行deploy时会报连接不安全错误
allowInsecureProtocol=true
// 配置仓库url
url='http://localhost:18081/repository/maven-snapshots/'
// 配置认证信息
credentials{
username 'admin'
password 'admin123'
}
}
}
}
主要步骤如下:
- 配置相关的发布插件:
apply plugin: 'maven-publish'
- 创建对应的发布task,定义任务名及相关的类库发布形式:
// 配置发布相关task
publications {
// lenPublish 为自定义名称,可写多个发布任务
lenPublish(MavenPublication){
// 发布jar包
from components.java
// 发布war包
// from components.war
}
}
- 配置相应的发布地址及认证信息,如果是
http
还需要允许不安全的连接模式:
// 配置项目发布地址
repositories {
maven {
// 配置允许http不安全连接,不然执行deploy时会报连接不安全错误
allowInsecureProtocol=true
// 配置仓库url
url='http://localhost:18081/repository/maven-snapshots/'
// 配置认证信息
credentials{
username 'admin'
password 'admin123'
}
}
}
- 执行相应的发布任务:
- 查看结果:
三、gradle 依赖冲突处理
项目中引入多个依赖时,难免会遇到多个依赖底层都依赖了相同子依赖的不同版本,这时就发生了子依赖版本冲突问题。gradle默认的依赖冲突解决方式是直接引入有版本冲突的子依赖中的最新版本。如下,两个spring模块都依赖了spring-core
子模块,但各自依赖的版本不一致,这时gradle会直接引入高版本的spring-code
,也即5.2.25.RELEASE
。
dependencies {
// 版本冲突处理:默认处理规则只引入高版本
implementation 'org.springframework:spring-expression:4.2.5.RELEASE'
implementation 'org.springframework:spring-beans:5.2.25.RELEASE'
}
当然,gradle也支持用户自己手动来解决冲突,主要提供了如下三种方式:
- 配置不自动解决冲突;
//方式一:配置不自动解决冲突
configurations.configureEach {
resolutionStrategy {
// 发生版本冲突时直接报错
failOnVersionConflict()
}
}
dependencies {
implementation 'org.springframework:spring-expression:4.2.5.RELEASE'
implementation 'org.springframework:spring-beans:5.2.25.RELEASE'
}
- 手动排除依赖(常用);
dependencies {
implementation 'org.springframework:spring-expression:4.2.5.RELEASE'
implementation('org.springframework:spring-beans:5.2.25.RELEASE') {
// 方式二:手动排除依赖
// 1. 手动排除指定依赖(常用)
exclude group:'org.springframework',module:'spring-core'
// 2. 手动排除所有依赖
// transitive=false
}
}
- 手动指定具体的版本。
//方式三:手动指定具体版本
configurations.configureEach {
resolutionStrategy {
// 强制指定 spring-core 版本,该版本可以是任意有效版本
force 'org.springframework:spring-core:5.2.24.RELEASE'
}
}
dependencies {
implementation 'org.springframework:spring-expression:4.2.5.RELEASE'
implementation 'org.springframework:spring-beans:5.2.25.RELEASE'
}
四、gradle 多模块项目实战
4.1 项目结构
接下来,将通过 gradle 演示如何构建一个包含父子模块的学生系统项目。该项目主要包含1个父模块和4个子模块,项目结构如下:
settings.gradle
文件主要配置项目各个模块的信息,内容如下:
rootProject.name = 'student-system-parent'
include 'student-system-domain'
include 'student-system-core'
include 'student-system-admin'
include 'student-system-portal'
4.2 模块介绍
各个模块功能介绍:
student-system-parent
:是整个项目的父模块,主要是针对项目的全局信息进行统一配置,包括仓库镜像地址,引入共同的plugin以及dependence,build.gradle
文件如下所示:// 项目全局配置 allprojects { // 信息配置 group = 'com.len.studentsystem' version = '1.0-SNAPSHOT' // 插件配置 apply plugin: 'java' // 引入maven发布相关插件 apply plugin: 'maven-publish' // 仓库镜像配置 repositories { // 阿里云镜像 maven { url "https://maven.aliyun.com/repository/public" } // maven 中央仓库 mavenCentral() } // 配置项目发布信息 publishing { // 配置发布task publications { // lenPublish 为自定义名称,可写多个发布任务 lenPublish(MavenPublication){ // 发布jar包 from components.java // 发布war包 // from components.war } } // 配置发布地址 repositories { maven { // 配置允许http不安全连接 allowInsecureProtocol=true // 配置藏库url url='http://localhost:18081/repository/maven-snapshots/' // 配置认证信息 credentials{ username 'admin' password 'admin123' } } } } } // 子模块需要的配置,下面的配置对父工程不生效 subprojects { dependencies { testImplementation platform('org.junit:junit-bom:5.9.1') testImplementation 'org.junit.jupiter:junit-jupiter' } test { useJUnitPlatform() } }
student-system-domain
:主要是存放一些POJO信息,build.gradle
内容如下:// 是空文件,因为相关内容都在parent的build.gradle文件配置好了
student-system-core
:主要是项目的业务层,所有的业务代码主要存放于此,同时该模块需要依赖于student-system-domain
,build.gradle
内容如下:dependencies { // 通过 project 指定依赖的 domain 来自于项目中;否则 domain 模块需要先 deploy 后,core 才能正确引入 implementation project(":student-system-domain") }
student-system-admin
:项目的管理后台,是一个web项目,通过依赖student-system-core
实现相关业务,build.gradle
内容如下:
通过idea配置本地tomcat,来部署该应用,可以参考官网: jetbrains// 这里不直接使用tomcat插件部署该应用,而是演示通过idea配置本地tomcat来部署 apply plugin: 'war' dependencies { // 依赖core模块 implementation project(":student-system-core") }
student-system-portal
:项目的门户,是一个web项目,通过依赖student-system-core
实现相关业务,build.gradle
内容如下:
配置好内置tomcat后,就可以通过执行相应的task来部署应用。// 通过引入tomcat-plugin,使用内置tomcat构建相应的部署任务 // 将二进制插件添加到build buildscript { repositories { gradlePluginPortal() } dependencies { classpath 'com.bmuschko:gradle-tomcat-plugin:2.7.0' } } // 应用插件 apply plugin: 'war' apply plugin: 'com.bmuschko.tomcat' dependencies { // 依赖core模块 implementation project(":student-system-core") // 指定tomcat使用的版本 def tomcatVersion = '9.0.1' tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}", "org.apache.tomcat.embed:tomcat-embed-logging-juli:9.0.0.M6", "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}" } // 配置tomcat相关信息,包括contextPath、端口等信息 tomcat { httpProtocol = 'org.apache.coyote.http11.Http11Nio2Protocol' ajpProtocol = 'org.apache.coyote.ajp.AjpNio2Protocol' httpPort = 8080 contextPath = '/student-system-portal' }
总结
以上就是今天介绍的内容,本文仅仅简单介绍了gradle构建工具的常见用法,更多用法可以参考gradle官网。
附录
gradle 插件官网
在官网可以查询插件的具体使用方法:地址
tomcat-plugin 官网
在这里可以参考不同tomcat版本相关的引入方法:地址