如何在Maven和Gradle中配置使用Groovy 2.4与Spock 1.0

gradle深入理解以及在android studio中的使用 - 简书
gradle深入理解以及在android studio中的使用
1.1 Gradle概念
Gradle是一个基于Apache ant和Apache maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的xml,当前其支持的语言限于java、groovy和scala[3],计划未来将支持更多的语言。1.2 Gradle的优势1:自动处理包相依关系;2:自动处理布署问题;3:条件判断写法直觉;过去 Java 开发者常用 Maven 和 Ant 等工具进行封装布署的自动化,或是两者兼用,不过这两个包彼此有优缺点,如果频繁改变相依包版本,使用 Ant 相当麻烦,如果琐碎工作很多,Maven 功能不足,而且两者都使用 XML 描述,相当不利于设计 if、switch 等判段式,即使写了可读性也不佳,而 Gradle 改良了过去 Maven、Ant 带给开发者的问题,至今也成为 Android Studio 内置的封装布署工具。1.3 Gradle基础
在gradle中最重要的两个概念是项目和任务,每一次构建都包括至少一个项目,每个项目又包括一个或者多个任务。每一个build.gradle文件就代表着一个项目,任务定义在项目的构建脚本里,当初始化构建过程时,gradle会基于build文件自动组装项目和任务对象。一个任务对象包含一系列的动作对象,这些动作对象之后会按照顺序执行。一个单独的动作对象就是一个待执行的代码块。1.3.1 构建生命周期一个gradle的构建通常有如下三个阶段a:初始化-项目实例会在该阶段被创建。
如果一个项目有多个模块,并且每一个模块都有其对应得build.gradle文件,那么就会创建多个项目实例;b:配置-在该阶段,构建脚本会被执行,并为每个项目实例创建和配置任务;c:执行-在该阶段,gradle将决定哪个任务会被执行,哪些任务会被执行取决于开始该次构建的参数配置和该gradle文件的当前目录;1.3.2 构建配置文件每一个基于gradle构建的项目,都会有一个build.gradle文件,android的构建文件中有一些是必需的:aaply plugin: 'com.android.application'buildscript{repositories{jcenter()}dependencies{classpath 'com.android.tools.build:gradle:1.2.3'}}1.3.3 项目结构/src/main/java -- 应用的源代码/src/main/res -- 应用相关的资源文件/libs --外部库/build -- 构建过程的输出1.4 Gradle wrapper入门
gradle是一个不断发展的工具,新版本可能会打破向后兼容性,而使用gradle wrapper可以避免这个问题,并能确保构建是可复用的;我们打开android studio可以看见有一个gradle文件夹,如图1所示
这里的gradle-wrapper.properties文件就是用来指定当前项目构建使用的gradle地址;
当项目中使用的不是最新的Gradle版本时,android studio就会显示一个提醒,提示并建议你自动更新gradle版本,原理是android studio修改了gradle-wrapper.properties的配置并触发了一次构建,这样最新的Gradle就会被下载;1.5 基本自定义构建1.5.1 理解gradle文件当使用studio创建一个新项目时,会默认生成三个gradle文件。其中的两个文件--setting.gradle和build.gradle文件位于项目的根目录,另外一个build.gradle文件则在android app模块内,下边我们分别介绍这几个gradle文件的用途;a:setting.gradle -setting文件在gradle初始化阶段被执行,并且定义了哪些模块应该被包含在构建中,新建android项目时默认只有 app一个模块,对于多模块项目必须要有setting.gradle文件,否则,gradle不知道哪个模块应该被包含在构建内;b:根项目的build.gradle文件,默认情况下其包含如下两个代码块buildscript{repositories{jcenter()}dependencies{classpath 'com.android.tools.build:gradle:1.2.3'}}allprojects{repositories{jcenter()}}其中jcenter是一个很有名的maven库,denpendenies代码块用于配置构建过程中的依赖包;c:模块的构建文件,包含以下文件1:插件apply plugin : 'com.android.application',2: android脚本android{compileSdkVersion 22buildToolsVersion "22.0.1"defaultConfig{applicationid ""versionName "1.0"versionCode 1}buildTypes {release{minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}}}3:
依赖包依赖包是标准gradle配置的一部分,其定义了一个应用或依赖项目的所有依赖包,默认情况下,一个新的android应用,在libs文件夹下对所有jar文件构成依赖。1.5.2 任务讲解任务包括基础任务(java基础插件提供基础服务支持)和android任务(android插件扩展了java基础插件提供android任务支持);基础任务包括 :assemble:集合项目的输出;clean :清理项目的输出;check:运行所有检查,通常是单元测试和集成测试;build:同时运行assemble和check;android任务包括:build:同时运行assemble和check任务,可以生成若干apk文件;help:install:安装apk文件到移动设备或者模拟器;other:verification:1.5.3 自定义构建1.5.3.1 操控manifest文件我们可以在项目的build.gradle文件下边配置applicationid,minSdkVersion,targetSdkVersion,versionCode,versionName,signingConfig,proguardFile等任务。在该文件下配置的选项默认会被构建进系统中,当没有被配置时才会去manifest文件查找;1.5.3.2 BuildConfig和资源文件自android sdk升级到17以后,构建工具会自动生成一个BuildConfig的类,该类包含一个按照构建类型设置值的DEBUG常量,如果有些功能只需要在debugging时期运行,那么我们就可以根据此常量来区分,示例代码如下:android{buildTypes{debug{buildConfigField "String", "api_uirl","\"\api/""buildConfigField "boolean", "LOG_HTTP_CALLS","true"resValue "string","app_name","example debug"
// (修改应用在桌面的现实名称)}release{buildConfigField "String", "api_uirl","\"\api/""buildConfigField "boolean", "LOG_HTTP_CALLS","true"resValue "string","app_name","example"
//(修改应用在桌面的现实名称)}}}1.5.3.3 项目属性,ext代码块ext {supportVersion ='25.0.1'frescoVersion ='0.14.1'}下边我们就可以直接应用定义的属性dependencies {compile"com.android.support:percent:${supportVersion}"compile"com.android.support:recyclerview-v7:${supportVersion}"compile"com.android.support:appcompat-v7:${supportVersion}"compile"com.android.support:support-v4:${supportVersion}"compile"com.android.support:design:${supportVersion}"}1.5.3.4 默认的任务如果没有指定任何任务而运行gradle的话,其会运行help任务,我们在顶层build.gradle文件中加入一行,可用来指定默认任务:defaultTasks 'clean' ,'assembleDebug'当你运行没有任何参数的gradle wrapper时,他会运行clean和assembledebug任务;1.6 创建构建Variant构建variant是用来提供多渠道多版本apk的一种实现方式,影响它的因数有两个:1:Product Flavor (定制产品);productFlavors {memebox_pc_download {buildConfigField"String","UMENG_CHANNEL_ID","\"com_flexable_cn\""buildConfigField"String","TALK_CHANNEL_ID","\"com_flexable_cn\""buildConfigField"String","CHANNEL_NAME","\"com_flexable_cn\""applicationid "com.example.flavor1"versionCode 20versionName "3.40.7"}}2:Build Types(构建类型);buildTypes {debug {minifyEnabled falsedebuggable truesigningConfig signingConfigs.release}release {buildConfigField"boolean","LOG_DEBUG","false"debuggable falseshrinkResources falseminifyEnabled truezipAlignEnabled truesigningConfig signingConfigs.releaseproguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}staging{applicationIdSuffix ".staging"versionName }}每一个渠道都会生成debug和release版本的包,当然也可以自定义你想要的任何构建类型;博客逐步迁移至
介绍了Gradle的安装与任务管理,这篇着重介绍Gradle的内建任务(in-built tasks)与自定义任务(custom tasks),借助Gradle提供的众多内建任务类型以及自己定制的任务类型,Java Web、Android等的开发、测试、部署将会变得非常容易。这篇随笔提供的都是非常简单的示例,但这对于读懂Gradle脚本(例如常见的build.gradle)或者是书写Gradle脚本相信是有帮助的。本文所有代码测试环境为Gradle 2.11
如有错误,请不吝指出,非常感谢;如本文对您有帮助,右下角点个推荐吧~
1.内建任务类(in-built tasks)
Gradle在不断地更新,其内建任务也在不断地丰富,这一章节介绍Gradle中最常用的几个内建任务类,这只是Gradle众多内建任务类中的一部分,抛砖引玉,更多方法可以参见
1.1 复制(Copy)
项目开发和部署过程中,复制文件是很常见的工作,gradle为了简化开发步骤提供了大量的内建任务类,Copy便是其中之一
先看一段最简单的代码
// org.gradle.api.tasks.Copy
// 将in.txt从当前文件夹复制到abc文件夹(不存在则新建)
// 代码中的路径为相对路径
task copyTask(type: Copy) {
from '.'
into 'abc'
include 'in.txt'
include 与 exclude
(1) include '*' =& 包含所有的文件以及文件夹
(2) include/exclude '*.xml' =& 包含/排除当前文件夹下xml类型文件
(3) include/exclude '*.txt','*.data' =&包含/排除多类文件,逗号隔开
(4) include/exclude '**/*.xml' =& 包含/排除所有文件夹下xml类型文件
// 定义一个copySpec,通常是重复使用的语句
// 插入到Task中
def dataContent = copySpec {
from 'src'
include '*.data'
task copyTask(type: Copy) {
from('.') {
exclude '*.txt', '*.xml' //排除txt、xml类型的文件
into 'build'
include '*'
includeEmptyDirs = false
with dataContent
(1) caseSensitive =& 大小写敏感,true/false,默认为true
(2) includeEmptyDirs =& 是否包含空文件夹,true/false,默认为true
(3) filter =& 重用org.apache.tools.ant.filters.*的方法
(4) 更多参见
1.2 重命名(Rename)
// rename(Closure closure)
// 执行gradle cT
// 将当前文件夹下的所有.txt文件复制到build/中,并将后缀改为.data
task copyTask(type: Copy) {
from '.'
into 'build'
include '*.txt'
rename { String fileName -&
fileName.replace('.txt' , '.data')
正则表达式
// rename(String sourceRegEx, String replaceWith)
// 将所有以out开头的文件复制到build/,并将out替换为output
// $指代正则表达式匹配的地方,从1开始
task copyTask(type: Copy) {
from '.'
into 'build'
include '*.txt'
rename 'out(.*)', 'output$1' //=& out.txt-&output.txt
// rename '(.*)t(.*)', '$1output$2'
&& 原来的结构如下
|--out.txt
|--build.gradle
&& 执行任务后结构
|--output.txt
|--out.txt
|--build.gradle
1.3 打包(Zip)
// 执行gradle zT
// 将src文件夹下所有文件打包到dest/文件夹下
task zipTask(type: Zip) {
File destDir = file('dest')
archiveName 'abc.zip'
from 'src'
destinationDir destDir
&& 原来的结构如下
|--hello.java
|--world.java
|--build.gradle
&& 执行任务后结构
|--abc.zip
// 解压后为hello.java和world.java2个文件
|--hello.java
|--world.java
|--build.gradle
1.4 删除(delete)
项目打包时,往往需要删除调试、测试时的临时文件,例如输出、日志等,可以使用内建方法Delete完成这个任务,使用也非常简单
task deleteTask(type: Delete) {
delete 'out.txt','log.txt'
1.5 执行(Exec)
每次执行时,都要切换环境,敲入命令,gradle提供了Exec内建方法去简化调试、测试过程,可以根据需要编写代码
// Java Web开发,关闭Tomcat
task stopTomcat(type:Exec) {
workingDir '../tomcat/bin'
commandLine './stop.sh'
// 重定向输出到扩展属性output,而不是控制台
// 当然可以改为输出到文件
standardOutput = new ByteArrayOutputStream()
ext.output = {
return standardOutput.toString()
(1) args(args) =&命令参数,List &String&
(2) commandLine(args) =&命令,List &String&
(3) environment(name, value),=& 临时添加一个环境变量,多个需Map
(4) workingDir(dir) =& 工作目录,file类型
(5) 更多参见
2.定制任务(custom tasks)
Gradle支持大量的插件,例如war、java、gretty等,这些插件能够自动化自动化编译、打包等过程,但是有时由于项目需求,插件并不能满足项目的需求,Gradle支持定制任务类去完成你的工作。接下来将介绍三种定制Gradle任务类的方法
2.1 创建build文件
// .../Test/build.gradle
println 'I Am A Custom Task'
class HelloTask extends DefaultTask {
String nickName = 'default'
@TaskAction
def action1() { println 'Step 3 I Am ' + name }
@TaskAction
def action2() { println 'Step 2 NickName Is ' + nickName }
task hello(type: HelloTask) {
nickName = 'gzdaijie'
doFirst { println 'Step 1' }
doLast { println 'Step 4' }
C:\Users\gzd\Desktop\Test&gradle -q hello
I Am A Custom Task
Step 2 NickName Is gzdaijie
Step 3 I Am hello
name是内置属性,值为任务名称,doFirst,doLast内置方法
扩展自类DefaultTask,@TaskAction新增Action
关于Task基础知识的介绍,可以参考我的
2.2 创建buildSrc目录
事实上,build.gradle文件中不适合写类的定义,假设我们定制的每个Task类都写在build.gradle中,那么build.gradle文件将会变得很大,可读性大大降低,但是又不想为此单独创建一个工程,那么将代码写在buildSrc文件夹中将是一个很好的选择。
// 文件 HelloTask.groovy
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
class HelloTask extends DefaultTask {
String nickName = 'default'
@TaskAction
def action1() { println 'Step 3 I Am ' + name }
@TaskAction
def action2() { println 'Step 2 NickName Is ' + nickName }
// 文件 build.gradle
task hello(type: HelloTask) {
nickName = 'gzdaijie'
doFirst { println 'Step 1' }
doLast { println 'Step 4' }
新建文件 buildSrc/src/main/groovy/ch3/HelloTask.groovy
目录结构如下
|--build.gradle
|--buildSrc/
|--groovy/
|--HelloTask.groovy
执行gradle -q hello
结果与2.1一致,build.gradle中的代码显得十分干净
2.3 创建独立的groovy项目
新建一个groovy项目,命名为HelloTask,可以使用eclipse、IDEA等IDE,接下来纯手工建项目吧~
新建文件~/HelloTask/src/main/groovy/HelloTask.groovy,将之前的HelloTask复制进去,然后在HelloTask/目录下新建文件build.gradle,这里我们同样使用gradle来构建groovy项目。
// =& HelloTask/build.gradle
// apply plugin 应用插件
apply plugin: 'groovy'
version=1.0
dependencies {
// 添加依赖
compile gradleApi()
compile localGroovy()
目录结构如下
|--build.gradle
|--HelloTask
|--build.gradle
|--HelloTask.groovy
在HelloTask/ 下执行gradle build
你会发现该目录下多了build/libs/HelloTask-1.0.jar
这就是我们编译好的定制任务类
接下来在HelloTask/ 下执行 gradle build,gradle会在src/main/groovy目录下搜寻所有的类build
回到Test/目录,清空所有内容,只留下build.gradle,写入以下内容
// =& Test/build.gradle
// buildscript 配置导入路径,包信息
buildscript {
repositories {
dirs '../HelloTask/build/libs' }
dependencies {
classpath group: 'ch3', name:'HelloTask',version:'1.0'
task hello(type: HelloTask) {
nickName = 'gzdaijie'
doFirst { println 'Step 1' }
doLast { println 'Step 4' }
在Test/ 中执行gradle hello,效果和2.1、2.2完全一致
1中介绍了常用的内建Task类,2.3中使用了Gradle创建了Groovy项目,并用了buildscript导入了编译好的包,入门指南写到这里,build.gradle已经很接近使用IDE(例如Eclipse、IDEA、Andriod Studio)自动生成的build.gradle文件了,Gradle依赖管理的威力已经开始显现。
实际项目开发中,更多地是导入maven仓库,而不是自己写依赖,但是希望这个指南能给希望了解Gradle的博友带来帮助,喜欢就关注一下吧~
阅读(...) 评论()AndroidStudio gradle配置 - CSDN博客
AndroidStudio gradle配置
刚从eclipse转androd studio遇到了很多坑,今天就帮大家来填填坑
自日,在I/O大会上,谷歌推出新的Android开发环境——Android Studio,并对开发者控制台进行了改进,增加了五个新的功能, google就已经彻底放弃eclipse 转as了!
我们知道as选择了最优秀的构建工具gradle
Gradle:Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。
面向Java应用为主。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。前途宽广啊
下面进入主题在as中主要是配置gradle和android gradle插件,注意了gradle和(android gradle插件)一定不能混为一谈,2者是有区别的。
android gradle插件依赖于gradle.目前最新的gradle版本是2.1.3
1.gradle的配置
当我们在setting下gradle下设置gradle选择“use defalut gradle wrapper(recommended)”时,as就会根据{project.dir}\gradle\wrapper\gradle-wrapper.properties文件中的配置去gradle
我们用as构建android项目时,配置gradle时我们必须在{project.dir}\gradle\wrapper\gradle-wrapper.properties文件中配置gradle包, &配置的gradle必须在缓存目录(&“用户主目录/.gradle/wrapper/dists/gradle-*.*.*”)或者在as安装目录下的gradle目录下存在对应的版本。
例如我的电脑:C:\Users\dsfg\.gradle\wrapper\dists\gradle-2.4-all
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
这个配置的gradle如果在目录“用户主目录/.gradle/wrapper/dists/..”存在的话,as就不会去https\://services.gradle.org/distributions/gradle-2.2.1-all.zip去下载了,as就会利用该目录下的缓存,如果该目录下不存在gradle的话as就会去站点根据gradle的版本去下载到“用户主目录/.gradle/wrapper/dists/gradle-2.2.1-all”目录下.
如果选择的是“use local gradle distribution”的话表示用的是本地的gradle,本地的gradle是在as的主目录下的gradle目录下,比如我的电脑D:\android开发环境\android-studio-ide-143.2739321-windows\android-studio\gradle\gradle-2.10,而不会去缓存目录 “用户主目录/.gradle/wrapper/dists/gradle-*.*.*”中去找。
“global gradle setting”我们暂时不考虑
2.android gradle 插件的配置
上面我讨论的是gradle的配置,下面我们来说说android gradle 插件的配置,我们通过主工程项目的build.gradle(不是module的build.gradle)来设置android gradle 插件
在build.gradle中
dependencies
&&&&classpath&'com.android.tools.build:gradle:2.0.0'}
  这里配置的android gradle插件的版本是2.0.0,再一次强调我们一定要记住gradle版本和android gradle插件的版本根本不是一回事,不能混为一谈,
下面是android studio版本, gradle版本,android gralde 插件的版本关系对应表
&下面附上官方的文档:
&&所有android
gradle 插件版本以及特征见&
& 想深入了解Gradle核心语言Groovy的朋友可以点击下面链接,里面详细介绍了groovy特定领域语言
本文已收录于以下专栏:
相关文章推荐
原文地址:/vir56k/p/4763810.html
  在产品开发中,经常需要发布各个版本,每个版本的服务器地址有不同的服务器地址。比...
转自:/liundev/p/5532015.html
最近开发关于微信一系列功能,发现分享、支付必须要打包签名才能测试,太耽误事了,耗时耗力。。。...
由于网络原因,Gradle在AndroidStudio中的更新会非常慢,所以试着离线配置Gradle
首先先进入Gradle官网http://gradle.org/gradle-download/下...
前言:可能有很多人和我一样,有时候从Github上下载一个感兴趣的项目后,迫不及待的用AS打开想运行看下效果,结果噩梦就这么开始了,AS一直停留在Build阶段没完没了,你心里还一直存有一丝希望它会B...
转载地址:/p/cd8fe9b16369#
我们还是以AndroidStudio 2.1.1为例来讲。
用AndroidStudio就逃...
在AndroidStudio中新建项目成功后会自动下载对应版本的Gradle,那么下载的Gradle到什么地方呢?Mac上会默认下载到 /Users//.gradle/wrapper/dists 目录...
androidstudio中各种gradle配置解释说明我们知道每一个app就是as里面的一个modle,最进由于工作接触了各种gradle配置眼花缭乱,现在此记录下来,以防止以后忘记,笔记如下:
相信以前用eclipse开发Android项目的时候 在打包发布的时候 就有一个很蛋疼的事 因为项目需要统计每个应用商店下载量、在线数、手机型号等数据 就必须每个商店都打包一个版本 这就非常蛋疼了 非...
build.gradle配置参数详解
//声明是Android程序
apply plugin: 'com.android.application'
//程序在编译的时候会检查...
gradle.properties有两个非常有用的属性:
1. **在Android项目中的任何一个build.gradle文件中都可以把gradle.properties中的常量读取出来,不管这...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

 

随机推荐