@xtccc
2016-09-23T14:35:01.000000Z
字数 3625
阅读 5592
Gradle
目录
安装好了Gradle之后,将 $GRADLE_HOME/bin 放入 $PATH 中,这样便可以直接使用gradle命令了。
在当前目录下创建文件 build.gradle,内容如下:
// build.gradle文件task hello << {println 'Hello, World !'}
这里的action实例名为hello,我们可以通过直接调用该action,如下:
$ gradle -q hello
Hello, World !
通过操作符 << 可以不断地为某个task积累action code
build.gradle文件
// 声明名为`Hello`的Tasktask Hello// 下面开始accruing task actionHello << {print 'Hello'}Hello << {print ', '}Hello << {println 'Gradle !'}
调用task Hello 的过程:
$ gradle -q HelloHello, Gradle !
build.gradle文件
// 声明名为DB的Tasktask DBDB << { println 'start connecting ...'}DB << { println 'start updating database ...'}DB { println 'Configuring This Task ... ' } // 配置本task
调用这个task
$ gradle -b build.gradle DBConfiguring This Task ...:DBstart connecting ...start updating database ...
从上面可以看出 定义task 与 配置task 的区别。
通过命令 gradle tasks ,可以看到当前项目所有的tasks。
如果我们的 build.gradle 文件的内容如下:
task hello {println "Hello !"}task hi << {println "Hi !"}
运行 gradle tasks 命令的结果如下:

Gradle的一次构建过程,会经历三个生命周期,分别是:
参考: 生命周期
Task的默认类型是DefaultTask,除此以外,还有其他几种类型。
Copy task将指定的文件复制到指定的目录下,如果目的目录不存在,则会自动创建该目录。
task copyFiles(type: Copy) {from 'build/libs'into 'copyed_build'include '*.jar'}
对于一个Java类,我们可以配置一个task,在该task中指定mainclass和参数,然后调用这个类。
假设文件为ReadTextFile.scala:
package cn.gridx.aws.s3import com.amazonaws.regions.{Regions, Region}import com.amazonaws.services.s3.AmazonS3Clientimport scala.io.Sourceobject ReadTextFile extends App {if (args.length < 4) {Console.err.println("请输入 :[AccessKey] [SecreteKey] [Bucket名称] [文件路径]")System.exit(100)}val AccessKey = args(0)val SecreteKey = args(1)val BucketName = args(2)val Path = args(3)val s3 = new AmazonS3Client()s3.setRegion(Region.getRegion(Regions.US_EAST_1))val obj = s3.getObject(BucketName, Path)val in = obj.getObjectContentval text = Source.fromInputStream(in).getLines().mkString("\n")in.closeConsole.out.println("读取除的文本内容为:\n")Console.out.println(text)}
现在要调用这个文件的主类,并向其中传入4个参数,那么相应的task可以在文件build.gradle中这么定义:
task runReadTextFile(type: JavaExec, dependsOn: 'classes') {main = 'cn.gridx.aws.s3.ReadTextFile'classpath = sourceSets.main.runtimeClasspathargs 'xxxx', 'yyyy', 'gridx-tmp', 'my_obj_key'println '开始执行task [runReadTextFile]'}
还可以指定运行时加入classpath的依赖包:
configurations {testRun}dependencies {testCompile 'junit:junit:4.11'compile 'com.typesafe.slick:slick_2.10:1.0.1'testRun 'org.slf4j:slf4j-api:1.6.4','mysql:mysql-connector-java:5.1.38'}task run(type: JavaExec, dependsOn: 'classes') {main = 'cn.gridx.scala.slick.mysql.Basic'classpath = sourceSets.main.runtimeClasspathclasspath += configurations.testRun // 加入testRun的依赖包到classpathprintln '开始测试运行 slick'}
task jarSources(type:Jar){from sourceSets.main.allSourceclassifier = 'source'}
task hello << {print 'Hello'}task comma(dependsOn: hello) << {print ', '}// 通过执行`gradle -q world`,会自动先指定所依赖的taskstask world(dependsOn: comma) << {println 'World'}
运行结果:
$ gradle -q worldHello, World
构建Java项目时会使用到 java plugin,所有的Java代码都在目录src/main/java下,项目结构如下:

build.gradle文件的内容如下:
apply plugin: 'java'
它的意思是调用java plugin进行构建,它会自动调用一系列的tasks来构建Java项目。
构建时,只需要运行命令gradle build即可,此时我们可以看到生成新的build目录:

除了生成.class文件外,还自动生成了打包文件Basic.jar。由于当前的目录是/Users/tao/IdeaProjects/Gradle/Basic,如果不进行任何配置的话,生成的Jar包的名称就是当前目录的名称。
在构建时,会发生以下事情:
~/.gradle/cachesrc/main/java中的所有代码build/class/mainbuild/test-resultsbuild/reports/testsbuild/tmp/jar中产生文件MANIFEST.MFbuild/libs/中的一个JAR包通过命令gradle clean,就可以将build目录清除了。