Gradle学习,这篇文章就够了

1. Gradle 认识

 下载以后,配置gralde环境变量:   D:\software\gradle-4.4\bin 【grale 需要JAVA_HOME】

目录结构:

   bin : gradle 命令
   docs: 手册
   lib:  gradle 依赖jar包
   media:  gradle 图标
   sample: 例子
   src:  源码
 输入 gradle  调用gradle.bat命令  默认搜索当前目录  build.gradle, 有输出信息,安装成功
 构建指定文件 :  gradle -b  a.gradle
       gradle --help:  查看gradle 指令    

 2.  grale功能就是构建文件, 定义构建文件的各种任务和属性, 每个任务包含Action动作

grale 项目结构,用idea创建以后默认的项目结果,和maven项目一样: 
   <project>:  存放整个项目的资源
        src 
           main         
              java :   java 代码
              resources:资源
           test  
              java 
              resources              
        build: 编译以后class文件、资源文件
        libs: 存放jar包
        build.gradle

buuld.gradle 文件结构:  

Project : 表示项目,表示一份构建文件代表一个项目
     TaskContainer: 任务容器  
       Task: gradle 要执行的一个任务
          Action:  Task表示要执行任务的方法[ 可以doFirst、doLast、或者Closure(闭包)]

2. Gradle 任务定义

2.1. build.gradle 编写,定义任务的第一种方式 

// 定义任务的第一种方式 
task hello1 {
   println "configuration is first task"
   // 在所有Action后面执行
   doLast{
     for(i in 0..<5){
	    println i
	 }
   }
   // 在所有Action前面执行
   doFirst{
     def s="do first..."
	 println "dofirst  name:$s"
   }
   
}
task hello2{
    println "configuration is second task"
} 

grald构建配置过程:
    配置:  配置project的所有task,看到 configura1 configura2 输出
    运行阶段: 只是执行hello1 

 2.2. build.gradle 编写,定义任务的第二种方式 

// 调用 Project的 tasks 属性的 create 方法来创建 Task
tasks.create(name: "showTasks"){
   doLast{
// 查看 Project的 tasks属性的 类型
   // tasks type is : tasks attrubute type class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated
   println "tasks attrubute type ${tasks.class}"
   // show all task 
// 遍历所有tasks 属性
   tasks.each{
        e-> println e  
   }
  }
}

输出:> Task :showTasks
tasks attrubute type class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated
task ':fkTask'
task ':hello1'
task ':hello2'
task ':showTasks'

2.3.  dependsOn  属性和  Type  属性

创建Task 时可通过 dependsOn 属性执行依赖Task,首先执行依赖Tasks, 可以通过Type 指定 该Task的类型 ,默认类型是Gradl实现的 DefaultTask类

task hello2{
    println "configuration is second task"
} 
 // dependsOn 指定 Task依赖 hello2 ,该 Task的 类型是 Copy (文件拷贝)
 // 把当前目录下的 a.txt 拷贝到 dist 目录下
 // Task type is copy , it fucntion si copy file from to into 
 // fkTask dependsOn hello2, so first run hello2 
tasks.create(name: "fkTask",dependsOn:"hello2",type:Copy){
     from "a.txt"
	 into "dist"
}

2.4. 案例: HelloWorld 编译运行 

build.gradle: 

apply plugin: 'java'


// 案例: HelloWorld 编译运行 
//1.  定义compile任务 类型是  JavaCompile
// point to type  JavaCompile
task compile(type: JavaCompile){
// point to source path   源代码路径 
   source= fileTree('src/main/java')
   classpath= sourceSets.main.compileClasspath
// point to byte_code output path   构建目录 
   destinationDir = file('build/classes/main')
   options.fork= true
   options.incremental= true 
}
// 2. 指定运行任务类型是 JavaExec, 这些都是 java 插件提供的
//  point to type  JavaExec
task run(type: JavaExec, dependsOn:'compile'){
   classpath = sourceSets.main.runtimeClasspath
   // run program to point to  main Funtion class 
  // 执行运行主类 
   main = 'lee.HelloWorld'
 
}

\src\main\java\HelloWorld.java

package lee;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

运行结果: D:\software\gradle-4.4\bin\Hello>gradle run

> Task :run
Hello World

3. 属性定义, groovy    基础语法

1. gradle 属性 定义:    
 project 属性
  task属性  
2. 5.1. 允许运行gradle命令通过-P 添加属性, 通过如下方式访问,如果不存在属性,会出异常
   5.2. 通过JVM 参数添加属性 

3.groovy   
定义 list 
定义 map 
Groovy  闭包 , 闭包就是一段代码,做作为参数

// 1.  point attrubite belong to project,   定义project属性  
// define a variable
version = 1.0
description = 'project attribute'

//2.  define list 
def list= ['a','b','c']
// list add element
list << 'd'
// get a element
println list.get(3)


// 3.  define a map 
def map = [ "key1":"value1" ];
// add key-value
map.key2="value2" 
// output key2
println map.get("key2")

// 4. Groovy  闭包 , 闭包就是一段代码,做作为参数
def b1 = { println '4.1.output closure' }
def method1(Closure closure){
   closure()
}
method1(b1)

// 带有参数闭包, 这里必须是 "" 
def f2 = {
     v1->
	   println "hello:${v1}"
}
def method2(Closure closure){
   closure('xiaoming')
}
method2(f2)



task showProp {
// 定义 task属性
  description  = 'task attribute' 
  
  doLast{
  // groovy output console function 
    println version
    println description
	println project.description
	// 5. 添加属性
	// 5.1. 允许运行gradle命令通过-P 添加属性, 通过如下方式访问,如果不存在属性,会出异常
	// gradle -P graph=ATI showProp 
	// 5.2. 通过JVM 参数添加属性 
	//  gradle -D org.gradle.project.graph=sss showProp 
	println "by -p add atrribute ${graph}"
  
  }
}

4. Grande  插件  : 开发的库

  使用: 
apply plugin: 插件名   引入插件以后相当于包含了该插件所有的任务类型、任务、属性等
 java 插件:
apply plugin: 'java'

gradle tasks --all: 查看java 下所有任务 

5.  依赖管理:

 5.1. 配置gradle 仓库,从哪里下载jar包

maven仓库:  
  repositories {
   // 指定 maven 远程仓库
   maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
   //  maven中央仓库
    mavenCentral()
	// 本地仓库
	maven{
	   url:"e:/abc" 
	}
  } 

 5.2. 组的概念: 
   一个 项目在 编译的时候依赖某一个组jar包,   运行的时候依赖某一组, 测试的时候有依赖其他组 
   
   JAR包配置:  和maven类似通过坐标 
   jar包依赖组 (group指定) + jar包名称(name指定) + jar包版本(version)

apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'lee.HelloWorld'  

 定义仓库 
repositories {
//	// 使用Maven默认的中央仓库
	mavenCentral()
}
// 定义仓库
//repositories {
	// maven远程仓库
//	maven {
		// 显式指定Maven仓库的URL
//		url "http://repo2.maven.org/maven2/"
//	}
//}

configurations {
	// 配置名为fkDependency的依赖组
	fkDependency
}
dependencies {
//	// 配置依赖JAR包方式1 
	fkDependency group:'commons-logging', name:'commons-logging', version:'1.2'
//	// 简写为如下形式 ,工作中常用 
//	fkDependency 'commons-logging:commons-logging:1.2'
// 如果依赖库需要进行额外配置,使用{}闭包
//implementation(name: 'alipaySdk-15.6.5-20190718211159-noUtdid', ext: 'aar') {
//       exclude group: 'com.squareup.okhttp3'
//    }
//	fkDependency (group:'commons-logging', name:'commons-logging', version:'1.2') {
//		// 提供额外配置...
//	}
//	// 简写为如下形式
//	fkDependency ('commons-logging:commons-logging:1.2') {
//		// 提供额外配置...
//	}
	

}

task showFkDependency {
	doLast{
		// 输出fkDependency的依赖的JAR包
		//  C:\Users\denganzhi\.gradle\caches\modules-2\files-2.1\commons-logging 下载路径
		println configurations.fkDependency.asPath
	}
}

 实际项目开发中不需要自己配置依赖组, 应用 使用java 插件以后, 插件默认添加了多个依赖组

   implementation:  主项目源代码所依赖组
   testImplementation: 项目测试代码依赖组
   archives: 项目打包依赖组
   compileOnly: 编译的时候才依赖组
   runtimeOnly: 运行的时候才依赖组
 
  implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'

6.  Groovy 自定义任务, 继承 DefaultTask基类


使用 @TaskAction 修饰方法,添加该类型任务以后,会自动会被调用,默认方法,

// 1. 继承DefaultTask定义自定义任务
class HelloWorldTask extends DefaultTask {
	@Optional
	def message = 'A'
	// 使用@TaskAction修饰的方法被自动当成Action
	@TaskAction
	def test(){
		println "test:$message"
	}
	def info(){
		println "info:$message"
	}
}
// 这里可以理解为类的一个变量
// grale hello  运行
// 输出: test A     
//   info B 
task hello(type: HelloWorldTask){
	doLast{
		info()
	}
}
// grale hello1 运行
// 输出  test B 
task hello1(type: HelloWorldTask){
	message = "B"
}

// 2. 指定 ShowTask.groovy 文件 
// 命令: grale  show 
// 使用Groovy文件中的task
task show(type: org.fkjava.ShowTask) 
// 使用Groovy文件中的task
task show1(type: org.fkjava.ShowTask) {
	// 对file属性赋值
	file = file("e:/hello.txt")
}

在build.gradle 同级目录下:.\buildSrc\src\main\groovy\org\fkjava\ShowTask.groovy

package org.fkjava;

import org.gradle.api.*
import org.gradle.api.tasks.*
/**
 * Description:<br>
 * Copyright (C), 2001-2018, Yeeku.H.Lee<br>
 * This program is protected by copyright laws.<br>
 * Program Name:<br>
 * Date:<br>
 * @author Yeeku.H.Lee [email protected]<br>
 * @version 1.0
 */
class ShowTask extends DefaultTask {
	@Optional
	File file = new File('e:/hello.txt')

	@TaskAction
	def show(){
		println file.text
	}

	// 该注解用于把该方法标注为默认执行的action
	@TaskAction
	def multiShow(){
		println "-------------"
		println file.text
		println "-------------"
	}
}

7. 实现Plugin<Project>定义自定义插件   [插件中里面有任务、有属性]

7.1. 直接在build.grale 中 自定义插件
7.2.  引入自定义 插件类

// 实现Plugin<Project>定义自定义插件
class FirstPlugin implements Plugin<Project> {
	// 重写接口中apply方法
	void apply(Project project){
		// 为项目额外定义一个User类型的user属性
        project.extensions.create("user", User)
		// 调用task方法定义showName任务
		project.task('showName') {
			doLast{
				println '用户名:' + project.user.name
			}
		}
		// 调用tasks对象(TaskContainer)的create方法定义showPass任务
		project.tasks.create('showPass') {
			doLast {
				println '密码:' + project.user.pass
			}
		}
	}
}
class User {
	String name = 'fkjava'
	String pass = 'leegang'
}
// 引入FirstPlugin插件
apply plugin: FirstPlugin
// 为Project的user属性的name属性赋值

user.name = "在build.gradle自定义插件name"

// 引入org.fkjava.ItemPlugin插件
apply plugin: org.fkjava.ItemPlugin
// 为org.fkjava.ItemPlugin插件所扩展的项目属性赋值
item.name='疯狂Android讲义'
item.price = 108
item.discount = 0.75

\buildSrc\src\main\groovy\org\fkjava\ItemPlugin.groovy

// 实现Plugin<Project>定义自定义插件
class FirstPlugin implements Plugin<Project> {
	// 重写接口中apply方法
	void apply(Project project){
		// 为项目额外定义一个User类型的user属性
        project.extensions.create("user", User)
		// 调用task方法定义showName任务
		project.task('showName') {
			doLast{
				println '用户名:' + project.user.name
			}
		}
		// 调用tasks对象(TaskContainer)的create方法定义showPass任务
		project.tasks.create('showPass') {
			doLast {
				println '密码:' + project.user.pass
			}
		}
	}
}
class User {
	String name = 'fkjava'
	String pass = 'leegang'
}
// 引入FirstPlugin插件
apply plugin: FirstPlugin
// 为Project的user属性的name属性赋值

user.name = "在build.gradle自定义插件name"

// 引入org.fkjava.ItemPlugin插件
apply plugin: org.fkjava.ItemPlugin
// 为org.fkjava.ItemPlugin插件所扩展的项目属性赋值
item.name='疯狂Android讲义'
item.price = 108
item.discount = 0.75

\buildSrc\src\main\groovy\org\fkjava\ItemPlugin.groovy

// 实现Plugin<Project>定义自定义插件
class FirstPlugin implements Plugin<Project> {
	// 重写接口中apply方法
	void apply(Project project){
		// 为项目额外定义一个User类型的user属性
        project.extensions.create("user", User)
		// 调用task方法定义showName任务
		project.task('showName') {
			doLast{
				println '用户名:' + project.user.name
			}
		}
		// 调用tasks对象(TaskContainer)的create方法定义showPass任务
		project.tasks.create('showPass') {
			doLast {
				println '密码:' + project.user.pass
			}
		}
	}
}
class User {
	String name = 'fkjava'
	String pass = 'leegang'
}
// 引入FirstPlugin插件
apply plugin: FirstPlugin
// 为Project的user属性的name属性赋值

user.name = "在build.gradle自定义插件name"

// 引入org.fkjava.ItemPlugin插件
apply plugin: org.fkjava.ItemPlugin
// 为org.fkjava.ItemPlugin插件所扩展的项目属性赋值
item.name='疯狂Android讲义'
item.price = 108
item.discount = 0.75

\buildSrc\src\main\groovy\org\fkjava\ItemPlugin.groovy

package org.fkjava;

import org.gradle.api.*
/**
 * Description:<br>
 * Copyright (C), 2001-2018, Yeeku.H.Lee<br>
 * This program is protected by copyright laws.<br>
 * Program Name:<br>
 * Date:<br>
 * @author Yeeku.H.Lee [email protected]<br>
 * @version 1.0
 */
class ItemPlugin implements Plugin<Project> {
	// 重写接口中apply方法
	void apply(Project project){
		// 为项目额外定义一个Item类型的item属性
		project.extensions.create("item", Item)
		// 调用task方法定义showInfo任务
		project.task('showItem') {
			doLast{
				println '商品名:' + project.item.name
				println '商品销售价:' + project.item.price * project.item.discount
			}
		}
	}
}

\buildSrc\src\main\groovy\org\fkjava\Item.groovy

class Item {
	String name = 'unknown item'
	double price = 0
	double discount = 1.0
}

运行代码:

/*
运行1: >gradle showName
 > Task :showName
用户名:在build.gradle自定义插件name
*/


>运行2: gradle showPass

> Task :showPass
密码:leegang

 > 运行3:gradle showItem

> Task :showItem
商品名:Android讲义
商品销售价:81.0

猜你喜欢

转载自blog.csdn.net/dreams_deng/article/details/106384705