Gradle学习笔记
1 Gradle简介
Gradle是源于Apache Ant和Apache Maven概念的项目自动化构建开源工具,它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置面向Java应用为主。当前其支持的语言暂时有Java、Groovy、Kotlin和Scala。
Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。
有人说Gradle使用groovy语言编写,简单,明了没像maven使用xml臃肿,
其实我倒不觉得,我觉得maven挺好的,管理jar依赖和项目生命周期挺方便的,
我使用Gradle只是因为公司用,不然我估计不会学习Gradle。
下面是Gradle的优点,自己斟酌吧。
- 按约定声明构建和建设;
- 强大的支持多工程的构建;
- 强大的依赖管理(基于Apache Ivy),提供最大的便利去构建工程;
- 全力支持已有的 Maven 或者Ivy仓库基础建设;
- 支持传递性依赖管理,在不需要远程仓库和pom.xml和ivy配置文件的前提下;
- 基于groovy脚本构建,其build脚本使用groovy语言编写;
- 具有广泛的领域模型支持构建;
- 深度 API;
- 易迁移;
- 自由和开放源码,Gradle是一个开源项目,基于 ASL 许可。
Java作为世界级主流编程语言。
2000年 Ant
2004年 Maven
2012年 Gradle
maven: 管理jar包+项目打包
坐标是根据xml配置的
Gradle不使用xml来配置,groovy语言,更有优势?
本课程主要分以下几个步骤来讲解Gradle工具的使用:
1.Gradle安装配置(windows版)
2.Gradle和Idea集成
3.groovy语言简单介绍
4.Gradle仓库的配置
5.Gradle入门案例
6.Gradle创建Java web工程并在tomcat下运行
7.Gradle构建多模块项目
编译web工程:
apply plugin:‘war’
2 Gradle环境搭建
2.1 下载
官方网站:https://services.gradle.org/distributions/
提供了两种下载方式,Binary-only是只下载二进制源码,Complete, with docs and sources是下载源码和文档。
如果有阅读文档的需求可以下载第二个,没有需要的下载Binary-only即可。
选择gradle-7.0.2-bin版本,下载到本地:
2.2 安装
解压下载的gradle-7.0.2-bin.zip到本地即可
2.3 配置
2.3.1 新建变量GRADLE_HOME
变量名:GRADLE_HOME
变量值:D:\01program_soft\01install_before\gradle\gradle-7.0.2
2.3.2 新建变量GRADLE_USER_HOME
变量名:GRADLE_USER_HOME
变量值:D:\01program_soft\01install_before\maven\localRepository
2.3.3 添加变量到path
变量名:Path
变量值:%GRADLE_HOME%\bin;
2.3.4 修改配置
在Gradle安装目录下的 init.d 文件夹下,新建一个 init.gradle 文件( 这个init.gradle就相当于maven中的settings.xml),
填写以下配置:
allprojects {
repositories {
maven { url 'file://E:\software\maven_repository'}
mavenLocal()
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
maven { name "Bstek" ; url "http://nexus.bsdn.org/content/groups/public/" }
mavenCentral()
}
buildscript {
repositories {
maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
maven { name "Bstek" ; url 'http://nexus.bsdn.org/content/groups/public/' }
maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
}
}
}
#repositories中写的是获取 jar 包的顺序。
#先是本地的 Maven 仓库路径;
#接着的 mavenLocal() 是获取 Maven 本地仓库的路径,应该是和第一条一样,但是不冲突;
#第三条和第四条是从国内和国外的网络上仓库获取;
#最后的 mavenCentral() 是从Apache提供的中央仓库获取 jar 包。
2.3.5 验证安装是否成功
Dos命令行输入:gradle
出现上面截图,说明Gradle配置正确。
2.3.5 Gradle配置本地仓库
gradle的默认仓库路径为用户目录下的.gradle目录,gradle并没有像maven那样提供配置文件,
若要修改默认仓库路径,我们可以设置环境变量GRADLE_USER_HOME,
windows下同理。我把仓库设置在gradle目录下
Linux:
export GRADLE_HOME=/usr/local/gradle
export PATH=$GRADLE_HOME/bin:$PATH
export GRADLE_USER_HOME=$GRADLE_HOME/.gradle
Windows:
GRADLE_USER_HOME=c:/gradle/.gradle
在环境变量中添加名为 “GRADLE_USER_HOME”,值为 “本地maven仓库位置” 的环境变量即可
以后gradle就会从指定的本地仓库进行库的下载和读取
不会再去用户目录下(user_home/.gradle/cache
)进行库的下载和读取
可能有很多人在纠结这个 Gradle 能不能像 maven 一样手动修改本地仓库,答案当然是肯定的,而且很简单,只需要在环境变量里面做个配置即可如下图:
即添加一个名称为 GRADLE_USER_HOME ,值是你想放gradle本地仓库的地方即可。
环境变量配置 GRADLE_USER_HOME 后,IDEA会自动识别本地仓库:
2.3.6 Gradle配置远程仓库
一般Gradle、maven从中央仓库mavenCentral()
http://repo1.maven.org/maven2/下载依赖包,
但是在国内下载速度巨慢,我们只能使用国内的镜像。
所以每个Gradle构建的项目中,我们可以在build.gradle做如下配置
repositories {
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
mavenCentral()
}
每个项目都如此配置难免麻烦些,我们可以配置一个全局配置文件。
在 C:Users 用户名.gradle 的目录下创建文件 init.gradle 并添加下面代码,使用阿里云的仓库地址。
allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
remove repo
}
}
}
maven {
url REPOSITORY_URL
}
}
}
gradle 配置指南
在 build.gradle 文件中加入以下代码:
allprojects {
repositories {
maven {
url 'https://maven.aliyun.com/repository/public/'
}
mavenLocal()
mavenCentral()
}
}
如果想使用其它代理仓,以使用spring仓为例,代码如下:
allProjects {
repositories {
maven {
url 'https://maven.aliyun.com/repository/public/'
}
maven {
url 'https://maven.aliyun.com/repository/spring/'
}
mavenLocal()
mavenCentral()
}
}
加入你要引用的文件信息:
dependencies {
compile '[GROUP_ID]:[ARTIFACT_ID]:[VERSION]'
}
2.3.7 IDEA中配置Gradle
在IDEA的Setting里打开"Build, Execution, Deployment"-“Build Tools”-“Gradle”。
勾选 Use local Gradle distribution,在 Gradle home 中选择安装的Gradle的路径。
如果在变量和配置文件中设置了Gradle的仓库路径,在 Service directory path 中就会自动填写地址,
如果想改的话可以手动修改。
新版界面:
2.4 Gradle新建Java工程
1.File–>New–>Project
2.在接下来的界面中选择"Gradle",JDK选1.8,勾选“Java”,点击“Next”
3.在接下来的界面中输入工程名称,工程存放目录,pom文件坐标三要素,点击“Finish”
4.构建的Gradle Java工程目录,如下:
- .gradle,gradle的相关支持文件,不用管
- .idea,IntelliJ IDEA的相关文件,不用管
- build,构建生成物,存放项目构建中生成的class和jar包
- gradle,一个gradle的包装程序,貌似直接用gradle不太好,得再包一层,这个其实我们也不用管
- src,我们写代码的地方,不用说了吧
- build.gradle,gradle的构建配置,这是我们要关心的,相当于Maven的pom.xml
- GradleLearn.iml,IntelliJ IDEA的项目文件
- gradlew,一段gradle wrapper的运行脚本
- gradlew.bat,一段gradle wrapper的运行脚本,For Windows
5.build.gradle文件中加入springframework依赖更新后,截图如下:
6.用gradle将工程打成jar包
build日志如下:
14:04:46: Executing task 'build'...
> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar
> Task :assemble
> Task :compileTestJava NO-SOURCE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test NO-SOURCE
> Task :check UP-TO-DATE
> Task :build
BUILD SUCCESSFUL in 0s
2 actionable tasks: 1 executed, 1 up-to-date
14:04:46: Task execution finished 'build'.
2.5 Gradle新建Web工程
1.File–>New–>Project
2.在接下来的界面中选择"Gradle",JDK选1.8,勾选“Web”,点击“Next”
3.在接下来的界面中输入工程名称,工程存放目录,pom文件坐标三要素,点击“Finish”
4.构建的Gradle Java工程目录,如下:
5.build.gradle文件中加入springframework依赖更新后,截图如下:
6.用gradle将工程打成war包
build日志如下:
14:19:52: Executing task 'build'...
> Task :compileJava NO-SOURCE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :war
> Task :assemble
> Task :compileTestJava NO-SOURCE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test NO-SOURCE
> Task :check UP-TO-DATE
> Task :build
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
14:19:53: Task execution finished 'build'.
3 groovy基本语法
3.1 输出语句
println("hello groovy");
println("hello groovy")
println "hello groovy"
3.2 定义变量
int string double
总结:groovy语言中都是对象,没有基本类型概念
int a =23
println a
def b=23
println b;
3.3 定义方法
def play(def str){
println(str+"===hello maven")
}
play("groovy")
3.4 定义分支语句
定义分支语句if…else…
def plays(def b){
if(b){
println("hello world")
}else{
println("hello groovy")
}
}
plays(true)
3.5 定义list和map集合及遍历
def list =["xiaohei","xiaochen","xiaosan"]
//根据下标获取集合中的元素
println list[0]
//遍历集合
for(str in list){
println str
}
//定义map集合
def map =["key1":"value1","key2":"value2","key3":"value3"]
//直接获取map集合中元素key
println map.get("key1");
//遍历map集合
for(entry in map){
println(entry.key+":"+entry.value);
}
3.6 groovy闭包
闭包就是groovy中一段代码块,主要是用来作为参数在方法之间传递使用
闭包一定有返回值,闭包没有return语言,返回null,反之,返回具体的值
没有return的闭包,没有太大的意义。
//定义闭包
def m ={
println("hello world");
}
//定义一个带闭包参数的方法
def play3(Closure closure){
closure(); //执行闭包中的内容
}
play3(m);
//定义带参数的闭包
def m2 = {
v->println("参数为"+v)
}
def play4(Closure closure){
closure("xiaohei");
}
play4(m2);
4 build.gradle配置详解
4.1 构建项目环境
plugins {
id 'java'
}
apply plugin:‘java’ ----Java工程
apply plugin:‘war’ ----web工程
4.2 项目组名和版本号
//项目组名和版本号
group 'com.tangguanlin'
version '1.0-SNAPSHOT'
4.3 源码的编译版本
//源码的编译版本
sourceCompatibility = 1.8
4.4 指定maven仓库
单个项目 指定maven仓库 build.gradle
//指定maven仓库 仓库管理
repositories {
mavenLocal() //先在本地仓库中找
mavenCentral() //再到中央仓库中找
}
4.5 定义jar包坐标
Gradle工程所有的jar包的坐标都在dependencies属性内放置 jar包依赖
每一个jar包的坐标都有三个基本元素组成
group,name,version
testcompile表示该jar包在测试的时候起作用,该属性为jar包的作用域
我们在Gradle里面添加坐标的时候都要带上jar包的作用域
compile打包的时候,会被打包到jar中
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile group: 'org.springframework',name:'spring-context',version: '5.0.2.RELEASE'
}
4.6 依赖继承
父工程加上这个标签,所有的子工程都有这些依赖了,
公共的属性放父工程中、子工程只定义自己特定的标签
allprojects{
}
4.7 子模块引用别的模块的代码
service工程引入dao工程代码:
dependencies{
compile project(":gradle_02_dao")
}
5 Gradle构建Java项目
5.1 项目截图
5.2 settings.gradle
settings.gradle
rootProject.name = 'gradle003'
5.3 build.gradle
build.gradle
//构建项目环境
plugins {
id 'java'
}
//项目组名和版本号
group 'com.tangguanlin'
version '1.0-SNAPSHOT'
//源码的编译版本
sourceCompatibility = 1.8
//指定maven仓库 仓库管理
repositories {
mavenLocal() //先在本地仓库中找
mavenCentral() //再到中央仓库中找
}
//Gradle工程所有的jar包的坐标都在dependencies属性内放置 jar包依赖
//每一个jar包的坐标都有三个基本元素组成
//group,name,version
//testcompile表示该jar包在测试的时候起作用,该属性为jar包的作用域
//我们在Gradle里面添加坐标的时候都要带上jar包的作用域
//compile打包的时候,会被打包到jar中
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile group: 'org.springframework',name:'spring-context',version: '5.0.2.RELEASE'
}
5.4 运行结果
构建日志:
14:05:57: Executing task 'build'...
> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar
> Task :assemble
> Task :compileTestJava NO-SOURCE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test NO-SOURCE
> Task :check UP-TO-DATE
> Task :build
BUILD SUCCESSFUL in 0s
2 actionable tasks: 1 executed, 1 up-to-date
14:05:57: Task execution finished 'build'.
6 Gradle构建Web项目
6.1 项目截图
6.2 setting.gradle
settings.gradle
rootProject.name = 'gradle004'
6.3 build.gradle
plugins {
id 'java'
}
apply plugin:'war'
group 'com.tangguanlin'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenLocal();
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile group: 'org.mybatis', name: 'mybatis', version: '3.5.6'
compile group: 'com.alibaba', name: 'fastjson', version: '1.2.75'
}
6.4 运行结果
构建日志:
14:01:00: Executing task 'build'...
> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :war
> Task :assemble
> Task :compileTestJava NO-SOURCE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test NO-SOURCE
> Task :check UP-TO-DATE
> Task :build
BUILD SUCCESSFUL in 0s
2 actionable tasks: 1 executed, 1 up-to-date
14:01:01: Task execution finished 'build'.
dencies {
testCompile group: ‘junit’, name: ‘junit’, version: ‘4.12’
compile group: ‘org.mybatis’, name: ‘mybatis’, version: ‘3.5.6’
compile group: ‘com.alibaba’, name: ‘fastjson’, version: ‘1.2.75’
}
## 6.4 运行结果
[外链图片转存中...(img-3MSCiaL2-1640245633249)]
构建日志:
```properties
14:01:00: Executing task 'build'...
> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :war
> Task :assemble
> Task :compileTestJava NO-SOURCE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test NO-SOURCE
> Task :check UP-TO-DATE
> Task :build
BUILD SUCCESSFUL in 0s
2 actionable tasks: 1 executed, 1 up-to-date
14:01:01: Task execution finished 'build'.