gradle版本:6.8.3
本文章源代码:码云地址-gitee.com/tangjingsha…
环境搭建
1. 下载gradle安装包
官网下载: https://gradle.org/install/
Binary-only:只有基本的运行所需要的
Complete:包含文档跟源码等
2. 配置环境变量
GRADLE_HOME=/Users/piangpiang/Documents/software/gradle-6.8.3
export GRADLE_HOME
export PATH=$PATH:$GRADLE_HOME/bin
3. 配置idea
use gradle from : 配置gradle安装路径
1. 'gradle-wrapper.properties' file(默认选项)
寻找根目录中的gradle目录下,gradle-wrapper.properties文件配置的gradle版本
2. 'wrapper' task in Gradle build script
3. Specified location
配置本地gradle安装路径
gradle user home: 类似于maven的本地仓库位置
- 遇到的问题
- 报错: Failed to notify build listener.
原因,版本不兼容。
idea版本 + gradle版本 需要一致
我本地是idea.2018,无法兼容gradle6.8.3,降低gradle版本/升级idea即可
- Failed to delete some children. This might happen because a process has files open or has its working directory set in the target directory.
- Failed to notify build listener. 权限不够
可能原因, idea+命令行,同事操作了改文件
导致该文件锁死了,使用 [sudo -rm -rf ]删除对应文件即可
如果影响文件过多,直接 [sudo chmod -R 777 *]
生命周期
加载流程图
1、initialization:初始化阶段
执行工程的setting.gradle文件。 解析整个工程下的所有Project,构建所有的Project对应的project对象
2、Configuration:配置阶段,初始化build.gradle
解析所有project对象中的task,构建好所有的task拓扑图(有向无环图)。
这个有向无环图其实就是各个执行一个Task所依赖的其他Task而形成的一种关系图。
3、Excution:执行阶段
执行具体的task,及其依赖的task(先执行目标Task依赖的Task,再执行目标Task)
graph TD
加载/gradle-6.8.3/init.d
--> 执行根目录下的settings.gradle
--> 执行根目录下的build.gradle
--> 执行build.gradle下的buildscript,初始化脚本执行所需环境jar包等
--> 加载buildSrc模块的插件
基础语法dsl
1. 变量的定义
//变量的定义,弱类型
def param_test1 = 10;
def param_test2 = "10";
def param_test3 = ["10","12"];
println param_test3
2. 闭包的定义
//闭包Closure,类似于匿名函数,lanbda表达式
def Closure1 = {
//默认是以it变量名去接收实参
println "Hello Closure, the param value is: " + it
}
Closure1("mm")
def Closure2 = {
x, y ->
println "Hello Closure, the param value is: " + x + ", " + y
}
Closure2("mm", "nn")
3. 任务的定义
task("task_test1", {
println("do config task_test1 ing.....")//Configuration阶段就会执行阶段就会执行
doLast {
print("task_test1.doLas>>>>>>>>")
}
})
task task_test2 {
println("do config task_test2 ing.....")//Configuration阶段就会执行阶段就会执行
doLast {
print("task_test1.doLas>>>>>>>>")
}
}
结果:
▶ gradle task_test2
> Configure project :
do config task_test1 ing.....
do config task_test2 ing.....
> Task :task_test2
task_test1.doLas>>>>>>>>
4. project的定义
一个bulid.gradle对应一个Project对象,可以类比Maven中一个pom文件对应一个子模块。
5. 自定义插件
/********************* pluign *********************/
//方法1
apply([plugin: MyPlugin])
//apply plugin: MyPlugin
class MyPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
project.task("my_plugin_test",{
println("MyPlugin.my_plugin_test...")
})
}
}
//方法2 引入本地文件,或者使用http请求,访问服务器脚本(可用于公共环境变量的控制)
apply from: "otherPlugin.gradle"//本地文件或者远程文件
//方法3 buildSrc模块
apply plugin: "com.learn.plugin.MyPluginOfBuildSrcTest"//buildSrc模块
//1.根目录 新建buildSrc模块
//2.buildSec.buildGradle,引入java-gradle-plugin插件,配置自定义插件
//3.buildSec.src.main.java 实现Plugin.apply方法
//4.引入第二步配置的plugins.id
基础配置
1. subprojects 和 allprojects 、buildscript的区别
allprojects:所有project的配置(根目录项目+子目录项目)
subprojects:仅子目录项目
buildscript:gradle脚本执行所需依赖(引入第三方插件参与构造,如spring-boot-gradle-plugin插件)
执行顺序: buildscript -> allprojects -> subprojects
2. gradle 与gradlew的区别
gradlew 会使用 gradle-wrapper.properties配置的版本来执行相关命令
如,查看版本,则执行以下命令,注意加上'./'否则会报错
sudo ./gradlew -v
报错: 错误: 找不到或无法加载主类 org.gradle.wrapper.GradleWrapperMain
是因为根目录没有/gradle/wrapper/相关文件,复制过去即可
3. 寻找,添加依赖
compile/api: 参与 当前项目+子项目 编译和打包
implementation:仅参与 当前项目 编译和打包
testCompile:仅参与 单元测试代码的 编译
4. 配置阿里云镜像
1.init.d
2.allProject
3.subProject
4.buildScript
5. 打包
//1.引入插件maven-publish
//2.配置repositories 为 mavenLocal()
//3.实现publishing
mavenlocal()寻址顺序(todo: 待验证)
USER_HOME/.m2/settings.xml >> M2_HOME/conf/settings.xml >> USER_HOME/.m2/repository
6. 跳过test
1. gradle build -x test
2.
常用命令
1. gradlew build --info --debug --stacktrace
可以使用此命令打印并排查构建时的堆栈信息,同时也可以用此命令检查 阿里云镜像是否配置成功
了
2. gradlew clean
报错: java.io.IOException: Unable to delete directory...
gradle的bug,去命令行,强行删除对应的文件即可
3. gradlew build
报错:package org.junit.jupiter.api does not exist
增加对应版本的引用即可
dependencies {
testCompile('org.junit.jupiter:junit-jupiter:5.4.2')
testImplementation('org.junit.jupiter:junit-jupiter:5.4.2')
}
对比maven
gradle = maven + shell脚本