Gradle构建初探

1. 什么是gradle?

很高兴能向大家介绍Gradle,这是一个基于JVM的富有突破性构建工具。

它为您提供了:

一个像ant一样,通用的灵活的构建工具

一种可切换的,像maven一样的基于约定约定优于配置的构建框架

强大的多工程构建支持

强大的依赖管理(基于ApacheIvy)

对已有的maven和ivy仓库的全面支持

支持传递性依赖管理,而不需要远程仓库或者pom.xml或者ivy配置文件

ant式的任务和构建是gradle的第一公民

基于groovy,其build脚本使用groovy dsl编写

具有广泛的领域模型支持你的构建

2. Gradle特性

基于声明的构建和基于约定的构建

Gradle的核心在于基于Groovy的丰富而可扩展的域描述语言(DSL)。 Groovy通过声明性的语言元素将基于声明的构建推向下层,你可以按你想要的方式进行组合。 这些元素同样也为支持Java, Groovy, OSGi, Web和Scala项目提供了基于约定的构建。 并且,这种声明性的语言是可以扩展的。你可以添加新的或增强现有的语言元素。 因此,它提供了简明、可维护和易理解的构建。

为以依赖为基础的编程方式提供语言支持

声明性语言优点在于通用任务图,你可以将其充分利用在构建中. 它提供了最大限度的灵活性,以让Gradle适应你的特殊需求。

构建结构化

Gradle的灵活和丰富性最终能够支持在你的构建中应用通用的设计模式。 例如,它可以很容易地将你的构建拆分为多个可重用的模块,最后再进行组装,但不要强制地进行模块的拆分。 不要把原本在一起的东西强行分开(比如在你的项目结构里),从而避免让你的构建变成一场噩梦。 最后,你可以创建一个结构良好,易于维护,易于理解的构建。

多项目构建

Gradle对多项目构建的支持非常出色。项目依赖是首先需要考虑的问题。 我们允许你在多项目构建当中对项目依赖关系进行建模,因为它们才是你真正的问题域。 Gradle遵守你的布局。

Gradle提供了局部构建的功能。 如果你在构建一个单独的子项目,Gradle也会帮你构建它所依赖的所有子项目。 你也可以选择重新构建依赖于特定子项目的子项目。 这种增量构建将使得在大型构建任务中省下大量时间。

多种方式管理依赖

不同的团队喜欢用不同的方式来管理他们的外部依赖。 从Maven和Ivy的远程仓库的传递依赖管理,到本地文件系统的jar包或目录,Gradle对所有的管理策略都提供了方便的支持。

Groovy

Gradle的构建脚本是采用Groovy写的,而不是用XML。 但与其他方法不同,它并不只是展示了由一种动态语言编写的原始脚本的强大。 那样将导致维护构建变得很困难。 Gradle的整体设计是面向被作为一门语言,而不是一个僵化的框架。 并且Groovy是我们允许你通过抽象的Gradle描述你个人的story的黏合剂。 Gradle提供了一些标准通用的story。这是我们相比其他声明性构建系统的主要特点。 我们的Groovy支持也不是简单的糖衣层,整个Gradle的API都是完全groovy化的。只有通过Groovy才能去运用它并对它提高效率。

自由和开源

Gradle是一个开源项目,并遵循ASL许可。

3.Groovy介绍及为什么使用Groovy?

Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 Groovy 与 Java 代码的互操作很容易。(注意:不是指Groovy替代java,而是指Groovy和java很好的结合编程。)

我们认为内部DSL(基于一种动态语言)相比XML在构建脚本方面优势非常大。它们是一对动态语言。 为什么使用Groovy?答案在于 Gradle 内部的运行环境。 虽然 Gradle 核心目的是作为通用构建工具,但它还是主要面向 Java 项目。 这些项目的团队成员显然熟悉 Java。我们认为一个构建工具应该尽可能地对所有团队成员透明。你可能会想说,为什么不能使用 Java来作为构建脚本的语言。 我认为这是一个很有意义的问题。对你们的团队来讲,它确实会有最高的透明度和最低的学习曲线。 但由于 Java 本身的局限性,这种构建语言可能就不会那样友善、 富有表现力和强大。这也是为什么像 Python,Groovy 或者 Ruby 这样的语言在这方面表现得更好的原因。 我们选择了 Groovy,因为它向Java人员提供了目前为止最大的透明度。 其基本的语法,类型,包结构和其他方面都与 Java一样,Groovy 在这之上又增加了许多东西。但是和Java也有着共同点。

4.Gradle安装

去官网下载https://gradle.org/目前最新版本

windows安装:

设置环境变量

GRADLE_HOME = D:\Program Files\gradle-X.X

Path = %GRADLE_HOME%\bin

Linux安装:

$ mkdir /opt/gradle

$ unzip -d /opt/gradle gradle-3.3-bin.zip

$ ls /opt/gradle/gradle-3.3

LICENSE  NOTICE  bin  getting-started.html  init.d  lib  media

$ export PATH=$PATH:/opt/gradle/gradle-3.3/bin

$ gradle -v

安装好后默认gradle的本地仓库在用户家目录下的.gradle里面,如果想改变仓库位置, 那   么就要配置环境变量:

GRADLE_USER_HOME = 自定义目录/.gradle

5. 构建

本篇将讲述如何用idea去构建一个gradle多模块关联的项目,附上项目下载地址(https://github.com/zhangsongyang/milestone)

5.1 File->New->Project-> 选择Gradle

5.2 next填写Groupld和Artifactld然后Next

这里建议勾选上Use auto-import和Create directories for empty content roots automatically,意思是说开启自动下载包和创建项目目录结构,如果不勾选就要手动创建了。

选择上Use local gradle distribution用本地自己配置的gradle,然后next,finish。

5.3 build.gradle文件用于编写项目构建信息,settings.gradle在多模块构建中用于定义多个模块名

build.gradle概要:

group'cn.zsy'

version'1.0-SNAPSHOT'

applyplugin:'java'

sourceCompatibility =1.8

//// 声明gradle脚本自身需要使用的资源,包括依赖项、

//第三方插件、maven仓库地址等

buildscript {

repositories {

mavenLocal()

mavenCentral()

jcenter()

maven {

name'Custom Maven Repository'

url'http://maven.aliyun.com/nexus/content/

repositories/central/'

}

}

dependencies {

classpath'org.gradle.api.plugins:gradle-nexus-plugin:0.4'

classpath'org.hibernate.build.gradle:

gradle-maven-publish-auth:2.0.1+'

}

}

allprojects {

group'cn.zsy'

version'1.0-SNAPSHOT'

// JVM 版本号要求

sourceCompatibility =1.8

targetCompatibility =1.8

// java编译的时候缺省状态下会因为中文字符而失败

[compileJava,compileTestJava,javadoc]*.options*.

encoding ='UTF-8'

applyplugin:'java'

applyplugin:'idea'

applyplugin:'maven-publish'

applyplugin:'maven-publish-auth'

applyplugin:'findbugs'

applyplugin:'project-report'

repositories {

mavenLocal()

maven {

name'Custom Maven Repository'

url'http://maven.aliyun.com/nexus/content/repositories/central/'

}

mavenCentral()

jcenter()

}

publishing {

publications{

mavenJava(MavenPublication) {

fromcomponents.java

}

}

repositories {

maven {

name='thinkjoy'

url"http:/xxxx/content/repositories/

${project.version.endsWith('-SNAPSHOT') ?'snapshots':'releases'}"

}

}

}

ext{

jedisVersion ='2.9.0'

commonslang3Version ='3.5'

nettyVersion ='4.1.8.Final'

}

dependencies {

compile"redis.clients:jedis:${jedisVersion}"

compile"org.apache.commons:commons-lang3:${commonslang3Version}"

compilegroup:'org.aspectj',name:'aspectjweaver',version:'1.8.10'

compilegroup:'org.slf4j',name:'slf4j-api',version:'1.7.23'

compilegroup:'org.slf4j',name:'slf4j-log4j12',version:'1.7.23'

compilegroup:'log4j',name:'log4j',version:'1.2.17'

compilegroup:'com.alibaba',name:'fastjson',version:'1.2.24'

compilegroup:'org.springframework',name:'spring-context',version:'4.3.6.RELEASE'

compilegroup:'org.springframework',name:'spring-context-support',version:'4.3.6.RELEASE'

compilegroup:'org.springframework',name:'spring-jdbc',version:'4.3.6.RELEASE'

compilegroup:'org.springframework',name:'spring-orm',version:'4.3.6.RELEASE'

compilegroup:'org.springframework',name:'spring-aspects',version:'4.3.6.RELEASE'

compilegroup:'org.springframework',name:'spring-oxm',version:'4.3.6.RELEASE'

compilegroup:'org.springframework',name:'spring-test',version:'4.3.6.RELEASE'

testCompilegroup:'junit',name:'junit',version:'4.12'

}

findbugs {

ignoreFailures =true

//    findbugsTest.enabled=false

}

tasks.withType(FindBugs) {

reports{

xml.enabled =false

html.enabled =true

}

}

}

buildscript是用来声明gradle脚本自身需要的资源,包括依赖项、第三方插件、maven仓库地址等。

allprojects用于声明所用模块的共有信息。

apply plugin:'java'

定义一个Java项目只需如此而已.这将会为你添加Java插件及其一些内置任务.

apply plugin:'findbugs'

该插件向你的项目添加了大量的执行质量检查的任务。

applyplugin:'maven-publish'

applyplugin:'maven-publish-auth'

用于发布到本地仓库或远程仓库上的插件。

repositories {

mavenLocal()

maven {

name'Custom Maven Repository'

url'http://maven.aliyun.com/nexus/content/repositories/central/'

}

mavenCentral()

jcenter()

}

用于配置仓库

mavenLocal()是本地仓库

maven {

name 'Custom Maven Repository'

url 'http://maven.aliyun.com/nexus/content/repositories/central/'

}

自定义自己的远程仓库

mavenCentral()   jcenter()中央仓库

publishing {

publications{

mavenJava(MavenPublication) {

fromcomponents.java

}

}

repositories {

maven {

name='thinkjoy'

url"http://repo.qtonecloud.cn/content/repositories/${project.version.endsWith('-SNAPSHOT') ?'snapshots':'releases'}"

}

}

}

配置publish到那个远程仓库,配置成功在idea上可以看到远程仓库的名字

ext{

jedisVersion ='2.9.0'

commonslang3Version ='3.5'

nettyVersion ='4.1.8.Final'

}

ext用于定义一些配置的版本信息,如jar的版本号。

dependencies

下面定义依赖的jar

compile"org.apache.commons:commons-lang3:${commonslang3Version}"

compilegroup:'org.aspectj',name:'aspectjweaver',version:'1.8.10'

compile project(':milestone-service')

providedCompile"javax.servlet:javax.servlet-api:3.1.0"

testCompilegroup:'junit',name:'junit',version:'4.12'

http://mvnrepository.com/可以查找jar的gradle的坐标

applyplugin:'war'

添加用于组装 web 应用程序的 WAR 文件的支持。

上图红框中一般是比较常用的几个task,

用gradle打好war包后可以用gradle的tomcat插件或idea里面配置tomcat来发布web程序。

实例代码参见:https://github.com/zhangsongyang/milestone

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,358评论 6 343
  • 导语: 随着技术的发展,不管是前端开发、服务端开发或者是移动端开发(移动也是前端的一个分支)中都会用到自动化构建工...
    伊始雨深阅读 2,945评论 0 4
  • spring官方文档:http://docs.spring.io/spring/docs/current/spri...
    牛马风情阅读 1,577评论 0 3
  • 目前为止,我们已经学习了如何修改Gradle构建属性,以及如何运行任务。本章,我们会深入了解这些属性,并且创建我们...
    sollian阅读 2,485评论 0 8