Gradleの最も詳細なチュートリアル、Gradleについては、これらを学ぶだけで十分です......

目次

グラドルの紹介

Groovy 言語の学習

Groovy 環境変数の構成

最初の Groovy プロジェクト

変数定義

文字列の定義

文字列の共通メソッド

プロセス制御

スイッチ

ために

閉鎖

基本スキル

閉鎖の使用シナリオ

クロージャの変数

リスト

意味

追加と削除

並べ替えて見つける

マップマップ

地図の操作

見上げる

トラバース

範囲

オブジェクト指向

オブジェクト定義

メソッド定義呼び出し

インターフェース

特性

メソッドのインターセプトと呼び出し

メタクラス

Jsonに対するGroovyの操作

オブジェクトのjsonへの変換

Gsonはjsonを処理します

Groovy 解析 xml

Groovy は xml を生成します

ファイルに対するGroovyの操作

Groovy はオブジェクトをファイルに書き込み、ファイルからオブジェクトを読み取ります

Gradle の学習と使用

ダウンロードとインストール

環境変数の構成

最初の gradle プロジェクトを作成する

ビルド スクリプトの概要

計画

タスク

プラグイン

バージョン競合の解決

マルチプロジェクトのビルドケース


グラドルの紹介

        何かを学ぶときは、その概念を理解する必要があります.まず、gradle の関連する概念を理解しましょう:

        Gradle は、Apache Ant および Apache Maven の概念に基づくプロジェクト自動化ビルド用のオープン ソース ツールです。Groovy ベースのドメイン固有言語(DSL) を使用してプロジェクト設定を宣言し、Kotlin 言語に基づいて kotlin ベースの DSL を追加し、XML に基づくさまざまな面倒な構成を放棄し、Java アプリケーションに焦点を当てています。現在サポートしている言語は C++、Java、GroovyKotlinScala、Swift で、今後さらに多くの言語をサポートする予定です。---- 百度百科事典より抜粋

        groovy と gradle を使用して実践した後の自己理解と要約は次のとおりです。

        1. Gradle は maven に似ており、プロジェクト jar パッケージ管理、依存関係管理、およびプロジェクト パッケージングを統合するツールです。

        2. gradle と maven の違いは、maven の面倒な xml 設定をキャンセルし、多数の面倒な xml 設定項目をユニークでシンプルな groovy 言語に置き換えることです。

        3. 独自のスクリプト言語を持つ Gradle はより柔軟です. プロジェクトをビルドするときに groovy 言語を使用してタスクを柔軟に作成し、自分のニーズに応じてプロジェクトをビルドできます. groovy でビルドされた gradle は、maven と比較して、スケーラビリティと柔軟性が高くなります.

Groovy 言語の学習

なぜgradleを学ぶ前にgroovyを学ぶ必要があるのですか?

        gradle ではプロジェクトのビルドスクリプトとして groovy 言語が使われています. gradle を使ってプロジェクトをビルドする際に groovy のソースコードを理解してどこから始めればよいかわからないことを避けるために, まず groovy について学ぶ必要があります. 例えば, build.gradleファイルに従って、まずそれを理解して定義できるかどうか試してみてください。

この記事のGroovy ソース コードのダウンロード アドレス:

リンク: https://pan.baidu.com/s/1MX4_Lk6ynF9waD7XPcG4FQ?pwd=pno3 
抽出コード: pno3 
--Baidu Netdisk スーパー メンバー V3 からの共有

Groovy 環境変数の構成

1. 最初のステップは、Groovy をダウンロードすることです。ダウンロード アドレス: https://groovy.apache.org/download.html

2. 以下は、エディターによってコンパイルされたバージョン コロケーション スキームです。

グルーヴィー

JVM が必要 (非インディ)

JVM 必須 (インディ) *

4.0 - 現在

なし

1.8 +

3.x

1.8 +

1.8 +

2.5 - 2.6

1.7 +

1.7+

2.3 - 2.4

1.6+

1.7+

2.0 - 2.2

1.5+

1.7 +

1.6-1.8

1.5 +

なし

1.5

1.4 +

なし

1.0

1.4-1. 7

なし

3. ダウンロードが完了したら、zip パッケージをローカル ディレクトリに解凍します。

4. 次に、環境変数を構成しましょう. このコンピュータのマウスの右ボタンをクリックして、プロパティを表示します. [システムの詳細設定] をクリックして、GROOVY_HOMEを構成します.

5. 次に、Path 変数で bin パスを構成します。

6. groovy 環境変数が正常に構成されていることを確認し、黒いウィンドウを開き、groovy -version と入力します。

最初の Groovy プロジェクト

最初の grovvy プロジェクトを作成しましょう。

1. アイデアの new-project-Groovy-GroovyLibrary をクリックし、groovy インストール ディレクトリを選択して、[次へ] をクリックします。

2. プロジェクト名を入力し、完了をクリックします

3. プロジェクトを選択し、マウスの右ボタンをクリックして、new-groovy スクリプトを選択し、最初の groovy プログラムを開始します。

4.さて、Hello World から Groovy の学習の旅を始めましょう。

5. マウスの右ボタン、実行、出力:

変数定義

        変数は java または def を使用して定義できます. groovy では変数はすべてオブジェクト型であり, 基本的なデータ型はありません. 基本的なデータ型が定義されていても, それらは自動的にオブジェクト型に変換されます. 変数は次のように定義されます.次のとおりです。

//强定义
int a=15
double b=12.3
println "a: "+a
println "a class: "+a.class
println "b: "+b
println "b class: "+b.class
//弱定义
def c=15
def d=11.2
def e="Hello World!"
println "c: "+c
println "d: "+d
println "e: "+e
println "c class: "+c.class
println "d class: "+d.class
println "e class: "+e.class
//弱定义可以修改变量的值
c=10.2
println "c: "+c
println "c class: "+c.class

実行結果は次のとおりです。

文字列の定義

groovy で文字列を定義するには、次の 3 つの方法があります。

       1. 一重引用符の定義:文字列の形式は、エスケープ文字を追加するなど、自分で制御する必要があります

        2. 二重引用符の定義:展開可能な文字列

        3. 三重引用符の定義:改行などの文字列に直接定義し、改行を直接入力する

コード構造は次のとおりです。

//字符串的定义方式
//单引号定义
def str1='abc'
//双引号定义
def str2="def"
//双引号可以以这种形式被引用
def str4="ghi${str2}"
//三引号定义
//三引号是带格式的定义,比如输入回车就是换行
def str3='''a
b
c
'''
println "str1: "+str1
println "str2: "+str2
println "str4: "+str4
println "str3: "+str3

実行結果は次のとおりです。

文字列の共通メソッド

1. Groovy は Java でクラス ライブラリを呼び出すことができます。どのメソッド String が Java にあり、どのメソッドを Groovy でも使用できますか。

def str1="abc"
println "长度:"+str1.length()
println "是否为空:"+str1.isEmpty()
println "下标对应的字符:"+str1.charAt(0)

def str2="d-e-f"
println "两个字符串是否相等:"+str2.equals(str1)
println "从固定位置截取:"+str2.substring(1)
println "从区间截取:"+str2.substring(0,2)
println "替换字符串:"+str2.replace("-","*")

def str3="g-h-i"
println "str3split : "+str3.split("-")

def str4="jkl"
println "转大写: "+str4.toUpperCase()

def str5="MNO"
println "转小写: "+str5.toUpperCase()

def str6=" pqr "
println "去首尾空格: "+str6.trim()

def str7="a"
def str8="b"
println "比较ASCII码: "+str7.compareTo(str8)

実行結果は次のとおりです。

プロセス制御

スイッチ

//a可以是任何类型
def a=1.2
switch (a){
    case '123':
        println("123")
        break;
    case [4,7,9]:
        println("456")
        break;
    case 1..20:
        println("1..20")
        break;
    case Integer:
        println("Integer")
        break;
    case  BigDecimal:
        println("BigDecimal")
        break;
    default:
        println("默认方法")
        break;
}

操作結果:

ために

//普通for循环
for (int i = 0; i < 3; i++) {
    println "普通for循环: "+i
}

//循环list
def list=[1,2,3]
for (i in list){
    println "list: "+i
}

//循环范围
for (i in 1..10){
    println "循环范围: "+i
}

//循环map
for(i in [1001:"zs",1002:"ls"]){
    println "循环map: "+i.key+"----"+i.value
}

実行結果は次のとおりです。

閉鎖

        groovy のクロージャーは、java8 のラムダ式に似ており、メソッドの省略形でもあります。

基本スキル

        クロージャーの本質は、中かっこ {} で囲まれたコードのブロックです。

//定义闭包
def mth1={println "Hello World!"}

//调用闭包
mth1.call()

//在闭包中传入参数
def mth2={str,num->
    println "str: "+str+" num: "+num
}
//调用闭包 传参
mth2.call("hello",123)

//闭包定义之省略参数 省略参数时必须使用it作为变量
def mth3={println "hello ${it}"}
//调用闭包 传参
mth3.call(123)

//闭包中定义返回值
def mth4={return "hello ${it}"}

println "闭包中定义返回值: "+mth4.call(123)

 実行結果は次のとおりです。

閉鎖の使用シナリオ

プリミティブ データ型との組み合わせ:

//与基本数据类型配合使用闭包
//定义一个从2递增到10递增的范围
2.upto(10){
    println "upto: "+it
}

//使用闭包实现从1加到100
def result=0
1.upto(100){
    return result+=it
}
println "result: "+result

//创建递减的范围
10.downto(1){
    println "downto: "+it
}

//创建一个执行多少次的闭包
3.times {
    println "times: "+it
}

 実行結果は次のとおりです。

文字列と組み合わせる:

//配合String使用闭包
def str1="a1b2c3"

//遍历字符串中的每一个字符 返回值是原来的字符串
def str2=str1.each {
    println "遍历字符串中的每一个字符: "+it
}
println "返回值是原来的字符串"+str2

//查找符合条件的第一个是数字的值
def str3=str1.find{it->it.isNumber()}
println "查找符合条件的第一个是数字的值: "+str3

//查找符合条件的所有的是数字的值
def str4=str1.findAll{it->it.isNumber()}
println "查找所有的是数字的值: "+str4

//判断任意一个值是否满足条件
def str5=str1.any{it->it.isNumber()}
println "判断任意一个值是否满足条件: "+str5

//判断每一个值是否满足条件
def str6=str1.every {it->it.isNumber()}
println "判断每一个值是否满足条件: "+str6

//对值进行收集 收集后返回值是list
def list=str1.collect {
    it->it.isNumber()
}
println "对值进行收集 收集后返回值是list: "+list.toListString()

実行結果は次のとおりです。

クロージャの変数

これ

クラスのインスタンス オブジェクトまたはクラス自体を表します

オーナー

       クロージャーがクロージャー内にネストされている場合、クロージャーはそれを定義するクロージャー オブジェクトを指します。

デリゲート

       ほとんどの場合、所有者と同じ

一般に、上記の 3 つの変数はすべて現在のクラス オブジェクトを指します。

//输出闭包中的变量
def mth1={
    println "this: "+this
    println "owner: "+owner
    println "delegate: "+delegate
}

mth1.call()

以下の結果: 

リスト

        groovy のリストは、デフォルトでは、配列のように定義される linkedlist です。

意味

//定义列表
def list=['1','a','b']
println "list: "+list
println "list: "+list.class

//定义数组
def arr1=[1,2,3] as int[]
int[] arr2=[4,5,6]
println "arr1: "+arr1
println "arr2: "+arr2

以下の結果:

追加と削除

//操作列表元素
def list1=['1','a','b','c','d','e']
//添加
list1.add(2)
list1.leftShift(3)
list1<<4
println "添加后的list: "+list1

//移除下标为0的元素
list1.remove(0)
//移除元素是d的
list1.removeElement("e")
//按照条件移除 移除下标是偶数的元素
list.remove{it%2==0}

//获取两个list的差
def list2=['1','2','3','4','5']
def list3=['1','2','3']
def list4=list2-list3
println "获取两个list的差: "+list4

実行結果は次のとおりです。

  

並べ替えて見つける

//排序
def list5=[3,2,5,6,7,4,1,9]
//升序排列
list5.sort()
println "list5.sort: "+list5.toListString()
//按照指定条件排序 降序排序
list5.sort{num1,num2-> num1-num2>0 ? -1:1}
println "list5.sort by rule : "+list5.toListString()
//按照字符串长度排序
def list6=['a','bbb','cc','dddd']
list6.sort{return it.size()}
println "按照字符串长度排序 : "+list6.toListString()

//查找
def list7=[1,2,3,4,5,6]
//查找是偶数的第一个数
println "查找是偶数的第一个数: "+list7.find {it%2==0}
//查找是偶数的所有的数
println "查找是偶数的所有的数: "+list7.findAll {it%2==0}
//查找是偶数的任意数
println "查找是偶数的任意数: "+list7.any {it%2==0}
//判断列表是否全部是偶数
println "判断列表是否全部是偶数: "+list7.every{it%2==0}
//最大值、最小值
println "最大值: "+list7.max()
println "最小值: "+list7.min()
//统计符合条件的偶素有多少个
println "符合条件的值有几个: "+list7.count{it%2==0}

以下の結果:

マップマップ

マップの定義と追加

//弱定义map
def map1=[1001:"zs",1002:"ls",1003:"ww",1004:"zl"]
//定义时可省略引号 前提是字符串是key
def map4=[zs:1001,ls:1002,ww:1003,zl:1004]
println "定义map: "+ map1.toMapString()
println "字符串为key时,定义时可省略引号map4: "+ map4.toMapString()

//将map强指引为其他类型的map
HashMap map2=[1001:"zs",1002:"ls",1003:"ww",1004:"zl"]
Hashtable map3=[1001:"zs",1002:"ls",1003:"ww",1004:"zl"]

//添加元素
map1[1005]="迪迦"
println "添加迪迦后: "+ map1.toMapString()

//在map中新增map
map1.'newMap'=[1006:"泰罗",1007:"佐菲"]

実行結果は次のとおりです。

見上げる

新しい groovy クラスの生徒を作成します。

class Student {
    Integer score
    String sex
}

新しい学生オブジェクトをマップに追加して検索します。

//查找
def map5=[
        "张三":new Student(score:70,sex:'男'),
        "莉莉":new Student(score:60,sex:'女'),
        "小红":new Student(score:59,sex:'女'),
        "老王":new Student(score:34,sex:'男')]

//查找map中及格的第一个人
println "查找map中及格的第一个人: "+map5.find {it.value.score>=60}
//查找map中及格的所有的人
println "找map中及格的所有的人: "+map5.findAll {it.value.score>=60}
//查找map中及格的所有的男生
println "找map中及格的所有的人: "+map5.findAll {it.value.score>=60&&it.value.sex=='男'}
//查找map中及格的所有的男生的名字
println "找map中及格的所有的人: "+map5.findAll {it.value.score>=60&&it.value.sex=='男'}.collect {it.key}
//将及格和不及格的分组
println "将及格和不及格的分组: "+map5.groupBy {it.value.score>=60 ? '及格' : '不及格'}

 以下の結果:

トラバース

//遍历
def map6=[
        "张三":new Student(score:70,sex:'男'),
        "莉莉":new Student(score:60,sex:'女'),
        "小红":new Student(score:59,sex:'女'),
        "老王":new Student(score:34,sex:'男')]
//方式1
map6.each {println it.key+"*******"+it.value}
//方式2
map6.each {key,value->println key+"*******"+value}
//方式3
map6.eachWithIndex{key,value,index->println key+"*******"+value+"*******"+index}

以下の結果:

範囲

//定义一个从2到5的范围
def fw1=2..5
println "定义一个从2到5的范围: "+fw1.size()

//定义一个从2到5 不包含5的范围
def fw2=2..<5
println "定义一个从2到5 不包含5的范围: "+fw2.size()

//操作
//获取范围中下标为0的元素
println "获取范围中下标为0的元素: "+fw1[0]
//判断范围是否包含3
println "判断范围是否包含3: "+fw1.contains(3)
//获取范围开始值
println "获取范围开始值: "+fw1.from
//获取范围结束值
println "获取范围结束值: "+fw1.to

以下の結果:

オブジェクト指向

オブジェクト定義

//创建空构造器的对象
def person1=new Person()

//创建构造器对象
def person2=new Person("张三","男",30)

//指定参数 创建对象
def person3=new Person(name:"张三",sex:"男",age:30)

//声明式
def person4=["王五",20] as Person
Person person5=["王五",20]

//属性取值
println "name:${person3.name} sex:${person3.sex} age:${person3.age}"
println "name:${person3.getName()} sex:${person3.getSex()} age:${person3.getAge()}"

メソッド定義呼び出し

//方法的定义和调用
def mth1={
    println "mth1"
}
mth1()
def mth2(p1,p2){
    println "mth2 p1: "+p1+" p2: "+p2
}
mth2("123","456")

以下の結果:

インターフェース

        インターフェイスの使用法は Java の使用法と一致しているため、ここでは繰り返しません。


interface Car {

    run()
}

特性

         Java の抽象クラスと同様に、抽象メソッドを定義でき、非抽象メソッド (メソッド本体なし) も定義できます。

trait CarTrait {

    run(){

    }

    abstract stop()
}

メタクラス

Java のリフレクション メカニズムと同様に、このメソッドはプロパティとメソッドを groovy クラスに動的に追加できます。

//动态为类添加没有的属性
Person.metaClass.email="[email protected]"
def p1=new Person("丽丽","女",28)
println "动态为类添加没有的属性: "+p1.email
//修改属性
p1.email="[email protected]"
println "动态修改属性: "+p1.email

//动态为类添加方法 将名字大写
Person.metaClass.setNameUpCase={->name.toUpperCase()}
def p2=new Person("lili","女",28)
println "动态为类添加方法 将名字大写: "+p2.setNameUpCase()

//添加静态方法 将名字小写
Person.metaClass.static.setNameLowerCase={String name->name.toLowerCase()}
println "添加静态方法 将名字小写: "+Person.setNameLowerCase("LILI")

以下の結果:

Jsonに対するGroovyの操作

オブジェクトとjsonの間の変換

import groovy.json.JsonOutput
import groovy.json.JsonSlurper

//将对象转换为json
def p1=new Person("lili","女",28)
//对象转json
def json = JsonOutput.toJson(p1)
println "将对象转换为json: "+json

//将对象列表转换为json
def list=[new Person("lili1","女",28),
          new Person("lili2","女",28),
          new Person("lili3","女",28),
          new Person("lili4","女",28)]
def json1 = JsonOutput.toJson(list)
println "将对象列表转换为json: "+json1

//将json转换为对象
def slurper = new JsonSlurper()
Person text = slurper.parseText(json)
println "将json转换为对象: "+text.class

//将json转换为list
def slurper1 = new JsonSlurper()
def list1 = slurper1.parseText(json1)
println "将json转换为list: "+list1.class

以下の結果:

Gsonはjsonを処理します

import com.google.gson.Gson

def p1=new Person("张三","男",30)
//利用Gson转换为json 需要将Gson的jar包导入到项目中
def gson=new Gson()
def json = gson.toJson(p1)
println "对象利用Gson转换为json: "+json

//将list转换为json
def list=[new Person("张三1","男",30),
          new Person("张三2","男",30),
          new Person("张三3","男",30)]
def ljson = gson.toJson(list)
println "list利用Gson转换为json: "+ljson

//json转对象
def json1 = gson.fromJson(json, Person.class)
println "json转对象: "+json1

//json转list
def json2 = gson.fromJson(ljson, ArrayList.class)
println "json转list: "+json2
println "json转list: "+json2.class

以下の結果:

Groovy 解析 xml

package com.groovy.test01

import groovy.xml.XmlSlurper
import groovy.xml.slurpersupport.GPathResult

final String xml='''
<students>
    <student id="1">
        <name>张三</name>
        <age>28</age>
        <sex>男</sex>
        <score>65</score>
    </student>
    <student id="2">
        <name>李四</name>
        <age>32</age>
        <sex>女</sex>
        <score>70</score>
    </student>
    <student id="3">
        <name>王五</name>
        <age>40</age>
        <sex>男</sex>
        <score>70</score>
    </student>
</students>
'''
//解析xml
def sp=new XmlSlurper()
def text = sp.parseText(xml)
//获取标签内的值
println "解析后的学生姓名: "+text.student[0].name.text()
//获取标签的属性
println "标签的属性: "+text.student[0].@id
//遍历获取的xml值
def list=[]
text.student.each{
    it->list.add(it.name.text()+"--"+it.age.text())
}
println "list的值是: "+list.toListString()

以下の結果:

Groovy は xml を生成します

import groovy.xml.MarkupBuilder

//生成xml的核心类
def writer = new StringWriter()
def builder = new MarkupBuilder(writer)

//创建根节点
builder.students(){
    //创建子节点 小括号里面填写属性
    student(id:'1'){
        //创建student中的子标签
        name('张三')
        sex('男')
        age(30)
    }
    //创建子节点 小括号里面填写属性
    student(id:'2'){
        //创建student中的子标签
        name('李四')
        sex('男')
        age(31)
    }
}
println "创建后的xml: "+writer

操作の結果は次のとおりです。

ファイルに対するGroovyの操作

//读取文件
def file = new File("f://student.xml")
//遍历文件中的每一行
file.eachLine {println "遍历文件中的每一行: "+it}
//读取文件中的所有的内容
def text = file.getText()
println "读取文件中的所有的内容: "+text
//获取所有的行 返回list
def lines = file.readLines()
println "获取所有的行 返回list: "+lines

//将文件复制到另一个文件中
def copy(String oldPath,String newPath){
    //确定目标文件
    def file = new File(newPath)
    if(!file.exists()){
        file.createNewFile()
    }
    //复制
    new File(oldPath).withReader{
        def lines = it.readLines()
        file.withWriter {
            lines.each {
                line->it.append(line+"\r\n")
            }
        }
    }
    return true
}
copy("f:\\student.xml","f:\\student2.xml")

以下の結果:

Groovy はオブジェクトをファイルに書き込み、ファイルからオブジェクトを読み取ります

Person オブジェクトを作成します。

class Person  implements Serializable{
    String name
    String sex
    Integer age

    Person() {
    }

    Person(String name, String sex, Integer age) {
        this.name = name
        this.sex = sex
        this.age = age
    }
}

IO ストリームを使用してオブジェクトを操作します。

//将对象保存为文件
def saveObject(Object obj,String path){
    //将文件封装为对象
    def file=new File(path)
    if(!file.exists()){
        file.createNewFile()
    }
    file.withObjectOutputStream {
        it.writeObject(obj)
    }
    return true
}
//将文件读取为对象
def readObj(String path){
    def obj=null
    def file=new File(path)
    if(!file.exists()){
        return null
    }
    file.withObjectInputStream {
        obj=it.readObject()
    }
    return obj
}
//创建对象
def person = new Person()
//将对象写入文件
println saveObject(person,"f:\\person.txt")
//将文件读取为对象
println readObj("f:\\person.txt")

実行結果は次のとおりです。

Gradle の学習と使用

ダウンロードとインストール

ここでは gradle-6.7-rc-1 バージョンをお勧めします 

ダウンロードアドレス:https://services.gradle.org/distributions

環境変数の構成

環境変数で設定: GRADEL_HOME

パスの構成:

 gradle が正常にインストールされたことを確認します。

最初の gradle プロジェクトを作成する

1. アイデアを開き、新しいプロジェクトを作成する

2. パッケージ名、プロジェクト名、バージョンを入力

 3. [完了] をクリックします

4. プロジェクト情報紹介

ビルド スクリプトの概要

計画

        プロジェクトは、ビルド中のコンポーネント (jar/war) を表します。ビルドが開始されると、gradle は build.gradle に基づいて Project オブジェクトをインスタンス化し、プロジェクトを通じてそのメンバーを呼び出します。

プロジェクトのプロパティ:

タスク

        Gradle には、ビルド、クリーンなどの組み込みタスクがいくつかあります。タスクをカスタマイズすることもできます。構文形式は次のとおりです。

タスクを定義する一般的な方法:

        タスクは build.gradle で定義できます

task task1,{
    println "task1"
    doFirst {

    }
    doLast{
        
    }
}

定義が完了すると、右側にタスク名が表示され、クリックしてタスクを実行できます。

 The tasks here appear under other by default. タスク グループを定義する必要がある場合は、次の形式で定義します。

task task1,{
    println "task1"
    group("MyTask")
    doFirst {

    }
    doLast{

    }
}

複数のタスクを定義する

tasks{
    task task2{
        group("MyTask")
        println "task2"
    }
    task task3{
        group("MyTask")
        println "task3"
    }
}

タスクの依存関係

タスクの依存関係を実装するには、dependsOn キーワードを使用します。

task task1,{
    println "task1"
    group("MyTask")
    doFirst {

    }
}

task task4,{
    println "task1"
    group("MyTask")
    dependsOn 'task1'
    doFirst {

    }
}

task task5(dependsOn:task4){
    println "task1"
    group("MyTask")
    dependsOn 'task1'
    doFirst {

    }
}

 タスクのライフサイクル

        Gradle のライフサイクルは、初期化フェーズ、構成フェーズ、実行フェーズの 3 つのフェーズに分かれています。

初期化フェーズ

        settings.gradlle で初期化が必要なプロジェクトを特定し、初期化が必要なすべてのプロジェクトのbuild.gradleファイルをロードして、各プロジェクトのプロジェクトオブジェクトを作成します。

構成フェーズ

        各プロジェクトの下でbuild.gradleスクリプトを実行してプロジェクトの構成を完了し、 Taskタスクの依存関係グラフを構築して、実行段階でTask内の構成コードを依存関係に従って実行できるようにします。

実行フェーズ

        構成段階のタスク図から、II を押して、実行する必要があるタスク内のアクション コードを実行し、実行タスク内のdoFirstまたはdoLastに記述されたコードを実行します

新しいプラグインを作成し、プロジェクトを jar パッケージにパッケージ化し、それを別のプロジェクトが使用できるように Maven ウェアハウスに公開します

1. 新しい gradle Java プロジェクトを作成します。

2. 新しい gradle Java プロジェクトの build.gradle ファイルで次の情報を構成します。

    id 'java-library'//配置此项表示项目可以打包为jar给其他项目使用
    id 'maven-publish'//将打包的项目发布到maven仓库中

 3. 新しいプラグインを新しい gradle Java プロジェクトの build.gradle ファイルに追加し、パッケージ化されたプロジェクトを Maven ローカル ウェアハウスに公開します。

//发布插件 将打包的项目发布到maven本地仓库
publishing{
    //配置发布动作
    publications{
        maven(MavenPublication){
            from components.java
        }
    }
    //配置发布到本地maven库中
    repositories {
        mavenLocal()
    }
}

 4. 最初にプロジェクトでクラスをビルドしてからビルドを実行し、ビルドが完了したら [発行] をクリックすると、jar パッケージがローカルの Maven ウェアハウスにパッケージ化されます。

5. ローカル ウェアハウスを開き、maven-metadata-local.xml を表示します。jar パッケージに関する情報があり、この jar パッケージを別のプロジェクトで直接参照して使用できます。

6. 別のプロジェクトでの参照用に、build.gradle ファイルの構成は次のとおりです。

//引入另一个jar包
    compile group: 'com.test', name: 'JarGradle', version: '1.0-SNAPSHOT'
mavenLocal()//先从maven本地仓库中找

 7. jar テストを引用して完了する

バージョン競合の解決

(1) 依存推移性:

        プロジェクトがライブラリに依存しており、そのライブラリが他のライブラリに依存しているとします。これらすべての依存関係を自分で見つける必要はありません。直接依存するライブラリを追加するだけでよく、Gradle はこれらのライブラリが間接的に依存するライブラリを暗黙的にプロジェクトに追加します。

(2) 推移的な作業におけるバージョンの競合:

        推移的な依存関係の特性上、2 つの異なるバージョンの jg に依存することになるため、バージョンの競合の問題があります。

マルチプロジェクトのビルドケース

ケースごとの完全なマルチ プロジェクト ビルド:

 

おすすめ

転載: blog.csdn.net/weixin_43195884/article/details/128129630