@xtccc
2016-09-23T22:35:01.000000Z
字数 3625
阅读 5140
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`的Task
task Hello
// 下面开始accruing task action
Hello << {
print 'Hello'
}
Hello << {
print ', '
}
Hello << {
println 'Gradle !'
}
调用task Hello
的过程:
$ gradle -q Hello
Hello, Gradle !
build.gradle文件
// 声明名为DB的Task
task DB
DB << { println 'start connecting ...'}
DB << { println 'start updating database ...'}
DB { println 'Configuring This Task ... ' } // 配置本task
调用这个task
$ gradle -b build.gradle DB
Configuring This Task ...
:DB
start 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.s3
import com.amazonaws.regions.{Regions, Region}
import com.amazonaws.services.s3.AmazonS3Client
import scala.io.Source
object 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.getObjectContent
val text = Source.fromInputStream(in).getLines().mkString("\n")
in.close
Console.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.runtimeClasspath
args '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.runtimeClasspath
classpath += configurations.testRun // 加入testRun的依赖包到classpath
println '开始测试运行 slick'
}
task jarSources(type:Jar){
from sourceSets.main.allSource
classifier = 'source'
}
task hello << {
print 'Hello'
}
task comma(dependsOn: hello) << {
print ', '
}
// 通过执行`gradle -q world`,会自动先指定所依赖的tasks
task world(dependsOn: comma) << {
println 'World'
}
运行结果:
$ gradle -q world
Hello, 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/cache
src/main/java
中的所有代码build/class/main
build/test-results
build/reports/tests
build/tmp/jar
中产生文件MANIFEST.MFbuild/libs/
中的一个JAR包通过命令gradle clean
,就可以将build目录清除了。