gradle 初步学习

495 阅读4分钟

gradle版本:6.8.3
本文章源代码:码云地址-gitee.com/tangjingsha…

环境搭建

1. 下载gradle安装包

官网下载: https://gradle.org/install/
Binary-only:只有基本的运行所需要的
Complete:包含文档跟源码等

image.png

2. 配置环境变量

GRADLE_HOME=/Users/piangpiang/Documents/software/gradle-6.8.3
export GRADLE_HOME
export PATH=$PATH:$GRADLE_HOME/bin

3. 配置idea

image.png

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的本地仓库位置
  1. 遇到的问题
  • 报错: Failed to notify build listener.
原因,版本不兼容。
idea版本 + gradle版本 需要一致
我本地是idea.2018,无法兼容gradle6.8.3,降低gradle版本/升级idea即可

image.png

  • 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 *]

生命周期

加载流程图

1initialization:初始化阶段

执行工程的setting.gradle文件。 解析整个工程下的所有Project,构建所有的Project对应的project对象

2Configuration:配置阶段,初始化build.gradle

解析所有project对象中的task,构建好所有的task拓扑图(有向无环图)。
这个有向无环图其实就是各个执行一个Task所依赖的其他Task而形成的一种关系图。

3Excution:执行阶段
执行具体的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

image.png

基础配置

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/相关文件,复制过去即可

image.png

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

可以使用此命令打印并排查构建时的堆栈信息,同时也可以用此命令检查 阿里云镜像是否配置成功

image.png

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脚本