gradle从入门到实战

这篇博客详细介绍了Gradle构建工具,包括其作用、与主流构建工具的对比、Groovy语言特性、构建脚本解析、项目创建、依赖管理、多项目构建以及项目发布流程。通过实例展示了Gradle如何简化构建过程。

一、关于构建工具

1.1 构建工具的作用

依赖管理;测试、打包、发布;机器能干的活,绝不自己动手

1.2 主流构建工具

  • Ant:编译、测试、打包;
  • Maven:依赖管理、发布;
  • Gradle:Groovy,具有更高的灵活性和可扩展性。

二、gradle概述

2.1 gradle是什么?

一个开源的项目自动化构建工具,建立在Apache Ant和Apache Maven概念的基础上,并引入了基于Groovy的特定领域语言(DSL),而不再使用XML形式管理构建脚本。 

2.2 gradle能做什么?

进行依赖管理,自动化运行测试、打包,发布到指定的地方去。 

 三、groovy

3.1 groovy是什么?

groovy是用于java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。

3.2 与java比较

  •  groovy完全兼容java的语法
  • 分号可以不写
  • 类、方法默认是public
  • 编译器给属性自动添加getter和setter方法
  • 属性可以直接用点号获取
  • 如果有返回值,可以不写return xxx,因为最后一个表达式的值会被作为返回值
  • == 等同于equal

下面是一个简单的groovy类样例: 

class ProjectVesion {
    def major
    def minor
    ProjectVesion(def major,def minor){
        this.minor = minor
        this.major = major
    }
}
ProjectVesion v1 = new ProjectVesion(1,1)
println(v1.major)
ProjectVesion v2 = new ProjectVesion(1,1)
println(v2.major == v1.major)
控制台输出

 3.3 高效的groovy特性

  • 自带的assert语句可以在任何地方进行断言
  • 弱类型编程语言,可以用def定义任何类型
  • 括号可以不写
  • 字符串三种形式:单引号,双引号,三单引号
def vesion = 1
//groovy中的字符串
def s1 = '单引号的String只是普通的string'
def s2 = "双引号的String可以添加变量${vesion}"
def s3 = '''三单引号的String可以换行
            换行了,第二号。。。。
            第三行。。。'''
println s1
println s2
println s3
输出

 

  • set,map,list有更简单的写法
//groovy中的list,默认类型为ArrayList
def list = ['s1','s2','s3']
//追加
list << 's4'
assert list.getClass() == ArrayList
assert list.size() == 4

//groovy中的map,默认类型为LinkedHashMap
def map = ['s1':'String1','s2':'String2']
//追加
map.'s3' = 'String3'
println(map.'s3')
println(map.getClass())
输出

 

  • 闭包
//闭包
//带有一个参数的闭包;箭头后面是方法体
def c1 = {
    v -> println v
}
//不带参数的闭包
def c2 = {
    println 'hello'
}
//使用闭包作为参数的方法
def method1(Closure closure){
    closure('param')
}
def method2(Closure closure){
    closure()
}
//调用方法,c1和c2分别作为参数
method1(c1)
method2(c2)
输出

四、看懂一个简单的gradle脚本 

//一个简单的java构建脚本.
//前提:构建脚本中默认都是有一个project实例的;
//apply为方法,传入参数plugin的值为'java'
apply plugin: 'java'
//version是一个变量,被赋值为'0.1'
version = '0.1'
//repositories是一个使用闭包为参数的方法,传入的参数为闭包{mavenCentral()}
repositories{
    mavenCentral()
}
//dependencies也是一个使用闭包为参数的方法;
//compile是一个方法,传入参数是'commons-codec:commons-codec:1.6'
dependencies{
    compile 'commons-codec:commons-codec:1.6'
}

 五、创建第一个gradle项目

(1)右键==》new==》module

(2)选择gradle==》java

(3)输入项目的组和名字

(4)使用默认的gradle或者本地安装的gradle。这里我选择默认的

(5)next==》finish

六、gradle构建脚本

 6.1 构建块

gradle构建中的两个基本概念是项目(project)任务(task),每个构建至少包含一个项目,项目中包含一个或多个任务。在多项目构建中,一个项目可以依赖于其他项目;类似的,任务可以形成一个依赖关系图来确保他们的执行顺序

 6.2 project和task的关系

6.3 project 

 一个项目代表一个正在构建的组件(比如一个jar文件),当构建启动后,gradle会基于build.gradle实例化一个org.gradle.api.Project类,并且能够通过project变量使其隐式可用

6.3.1 project属性

project有三个属性:group、name、version。

  • group:组;
  • name:名字;
  • version:版本号。

这三个属性能唯一确定一个组件,如果不能,说明你的依赖是不明确的。

6.3.2 project几个比较重要的方法 

  • apply:应用插件
  • dependencies:声明项目依赖于哪些java包
  • repositories:仓库。表示去哪个仓库加载java包
  • task:声明项目里有哪些任务

 6.3.3 project属性的其他配置方式

  • ext
  • gradle.properties。可以在gradle.properties里面用键值对的方式声明属性

6.4 task

任务对应org.gradle.api.Task。主要包括任务动作和任务依赖。任务动作定义了一个最小的工作单元。可以定义依赖于其他任务、动作序列和执行条件 。

任务不一定是我们自己定义的,我们可以自己定义任务,但是我们使用了插件以后,这些插件默认是带了很多任务的

6.4.1 task比较重要的方法

  • dependsOn:声明动作依赖
  • doFirst、doLast(<<)。 doFirst:在动作列表最前面添加动作;doLast(<<):在动作列表最后面添加动作

 6.5 构建的生命周期

  • 初始化: 初始化项目,有哪些项目要参与到构建中
  • 配置阶段:  生成task依赖关系和执行图
  • 执行阶段:  指定task的动作

七、依赖管理

几乎所有的基于JVM的软件项目都需要依赖外部类库来重现现有的功能。自动化的依赖管理可以明确依赖的版本,可以解决因传递性依赖带来的版本冲突

 7.1 工件坐标

工件坐标,也就是java包的位置,由group,name,version确定。

7.2 常用仓库

  • mavenLocal:本地仓库
  • mavenCentral/jcenter:远程仓库
  • 自定义maven仓库,也就是私服
  • 文件仓库

前三个比较常用,在配置时一般会先从本地仓库获取java包,再从私服获取,如果本地仓库和私服都没有,就从远程仓库获取

八、实操:多项目构建

 在企业项目中,包层次和类关系比较复杂,把代码拆分成模块通常是最佳实践,这需要你清晰的划分功能的边界,如果把业务逻辑和数据持久化拆分开来。项目符合高内聚低耦合时,模块化就变得很容易,这是一条很好的软件开发实践

8.1 项目结构

 所有项目=子项目+根项目 。

子项目划分为三个:model、repository、web

 

8.2 gradle配置

8.2.1 根目录build.gradle

group 'com.practice.gradle'
version '1.0-SNAPSHOT'
//所有项目配置
allprojects {
    apply plugin: 'java'
    apply plugin: 'maven-publish'//用于发布

    //配置属性,配置要发布什么,配置仓库地址
    publishing {
        publications {
            //myPublish是自定义的,这里把java产生的输出发布出去
            myPublish(MavenPublication) {
                from components.java
            }
        }
        repositories {
            //URL:一般为私服地址
            maven {
                name ""
                url ""
            }
        }
    }
    sourceCompatibility = 1.8

    repositories {
        mavenLocal()
        mavenCentral()
    }
}
//子项目配置
subprojects {
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }

}

8.2.2 web子项目 build.gradle

//web项目打包成war
plugins {
    id 'war'
}

dependencies {
    compile project (":repository")
}

 8.2.3 repository子项目 build.gradle

dependencies {
    compile project (":model")
}

九、项目发布

项目发布,简单来说分三步骤:

(1)使用maven-publish插件

apply plugin: 'maven-publish'//用于发布

(2)配置属性,配置要发布什么,配置仓库地址

//配置属性,配置要发布什么,配置仓库地址
publishing {
    publications {
        //myPublish是自定义的,这里把java产生的输出发布出去
        myPublish(MavenPublication) {
            from components.java
        }
    }
    repositories {
        //URL:一般为私服地址
        maven {
            name ""
            url ""
        }
    }
}

(3)执行发布任务。在项目的根目录下找到publishing,执行对应的发布任务

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值