第7章java快速开始
7.1java插件
我们知道,Gradle是一个多用途的构建工具,它可以构建你想在构建脚本中实现的任何事情。不过,作为开箱即用的产品,它不会做任何构建脚本不包含的任务。
大多数Java项目都和基础项目很相似:你需要编译java源文件,执行一些单元测试,创建一个包含你的classes的JAR文件。如果你没有必要为每一个这种项目都编写构建脚本的话,那会是很好的。幸运的是,你确实没有必要这么做。Gradle通过使用插件来解决这个问题,插件对Gradle来说是一种扩展,它以某些方式来配置你的项目,典型地是添加一些预先配置的任务去做一些有用的事情。Gradle本身包含了很多插件,并且你可以很容易地编写你自己的插件,并将其和他人分享。这样的一个插件就是Java插件,这个插件给你的项目添加一些任务,它会编译和测试你的Java源代码,并将之打包为JAR文件输出。
Java插件是基于惯例的。这意味着,插件为项目的某些方面定义了默认值,例如从何处加载Java源文件。如果你在你的项目中遵守惯例,一般地,你不需要在你的构建脚本中做太多事情就可以获得一个有用的构建。如果你不希望或者在某些情况下不能遵守惯例,Gradle允许你自定义你的项目配置惯例。事实上,因为对Java项目的支持就是通过插件来实现的,因此你完全可以不使用插件来构建Java项目,如果你确实不想要那么做的话。
在之后的章节中,我们用了一些例子来深层次的覆盖了关于Java插件,依赖管理和多项目构建的内容。在本章节,我们想要给你一个如何使用Java插件构建项目的初步认识。
7.2一个基础的Java项目
让我们来看一个简单的例子。为了使用Java插件,将下面的代码加入到你的构建文件中。
例子7.1使用Java插件
build.gradle
apply plugin: 'java'
注意:该例子的代码可以在gradle的binary和source的发布包中samples/java/quickstart目录下找到。
以上就是定义一个Java项目所需要做的,这会为你的项目添加Java插件,Java插件会为你的项目增加很多任务。
Gralde期望在src/main/java目录下找到你项目的源代码,在src/test/java中找到你的测试代码,此外src/main/resources中的任何文件都会作为资源包含到JAR文件中,src/test/resources中的任何文件都会包含到classpath中,用来执行测试。输出文件都会放到build目录下,JAR文件会放到build/libs目录下。
7.2.1构建项目
Java插件给你的项目增加了很多任务,但是这只不过是你构建项目所需任务中的一小部分。
最常用的任务是build任务,它会对项目进行完整的构建。当你运行gradle build,Gradle会编译和测试你的代码,继而创建一个包含classes和resources的JAR文件。
例子7.2构建Java项目
gradle build的输出:
> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
Total time: 1 secs
其他一些有用的任务:
clean
删除build目录,移除构建过程中的所有输出文件
assemble
编译并将代码打成JAR包,但是不执行单元测试。其他插件为该任务添加更多的特性。举个例子,如果你使用War插件,该任务也会为你的项目构建WAR文件。
check
编译和测试你的代码,其他插件为该任务添加更多的检查。例如,如果你使用checkstyle插件,该任务也会在的源代码上运行Checkstyle。
7.2.2外部依赖
通常,一个Java项目会依赖一些外部的JAR文件,你需要告诉Gradle在哪里寻找这些文件,从而在你的项目中引用这些文件。在Gradle中,像JAR文件这类的资源都会放在一个资源库(repository)中。资源库可以用来查找项目依赖,或者发布项目资源。下面的例子中,我们将使用Maven资源库:
例子7.3添加Maven资源库
build.gradle
repositories {
mavenCentral()
}
接着来添加一些依赖吧。这里,我们会申明,production classes在编译期依赖commons collections,test classes在编译期依赖junit。
例子7.4添加依赖
build.gradle
dependencies {
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
你可以在第8章找到更多关于依赖方面的知识。
7.2.3定制项目
Java插件会给你的项目添加了一些属性,这些属性都有默认值,通常这些默认值足以启动项目了。如果这些默认值不合适,改变这些值也是很容易的。来看下一下面这个例子,这里我们为Java项目指定了版本号,跟着指定了编写代码使用的Java版本,同时我们也为JAR描述 清单(manifest)添加了一些属性。
例子7.5自定义的MANIFEST.MF
build.gradle
sourceCompatibility = 1.5
version = '1.0'
jar {
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
}
}
Java插件添加的任务也是规则的任务,他与在build文件中定义的任务是一样的,这意味这你可以使用在任何在先前章节中所展示的机制来定制这些任务。例如,可以设置任务的属性,为任务添加行为,改变任务的依赖性,完整地替换任务。在下面的例子中,我们将会配置test任务,其类型是Test,然后在tests任务执行的时候增加一个系统属性。
例子7.6添加测试系统属性
build.gradle
test {
systemProperties 'property': 'value'
}
7.2.4发布JAR文件
通常,JAR文件需要在某处发布。当发布JAR文件时,你需要告诉Gradle将JAR文件发布到何处。在Gradle中,JAR文件会被发布到资源库中。在下面的例子中,我们将其发布到本地的一个目录,你也可以将其发布到远程位置,或多个位置。
Example 7.7. 发布JAR文件
build.gradle
uploadArchives {
repositories {
flatDir {
dirs 'repos'
}
}
}
执行gradle uploadArchives来发布JAR文件。
7.2.5创建Eclipse项目
为了将你的项目导入到Eclipse,你需要在build文件中添加另一个插件:
例子7.8Eclipse插件
build.gradle
apply plugin: 'eclipse'
现在,执行gradle eclipse命令生成Eclipse项目文件,更多关于Eclipse任务的内容,请参考38章节。
7.2.6总结
这里是例子的完整的构建文件
例子7.9Java例子-完整的构建文件
build.gradle
apply plugin: 'java'
apply plugin: 'eclipse'
sourceCompatibility = 1.5
version = '1.0'
jar {
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
}
}
repositories {
mavenCentral()
}
dependencies {
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
test {
systemProperties 'property': 'value'
}
uploadArchives {
repositories {
flatDir {
dirs 'repos'
}
}
}
7.3多项目Java构建
现在看一个典型的多项目构建。下面是项目的布局:
例子7.10多项目构建-分层布局
Build layout
multiproject/
api/
services/webservice/
shared/
注:本例子的代码可以在Gradle的binary和source的发布包中的samples/java/multiproject目录下。
这里我们有三个项目,项目api生成一个为客户端提供访问xml webservice的Java客户端的JAR文件,项目webservice是一个返回XML的web app,项目share包含项目api和项目webservice所使用的代码。
7.3.1定义多项目构建
为了定义多项目构建,你需要创建一个settings文件,该文件在代码的根目录,指定了哪些项目需要引入到构建中,该文件必须为settings.gradle。在下面的这个例子中,我们使用了一个简单的分层布局,下面是相应的settings文件:
例子7.11多项目构建-settings.gradle文件
settings.gradle
include "shared", "api", "services:webservice", "services:shared"
在第56章中你可以找到更多关于settings.gradle文件的内容。
7.3.2共通配置
对于大多数项目,有一些配置是所有项目通用的。在例子中,在根项目定义了共通配置,使用了一个叫做配置注入(configuration injection)的技术。这里,根项目就像一个容器,subprojects 方法迭代容器中的元素(项目),并给它们注入配置。这样,我们很容易为所有的项目定义描述清单的内容,以及一些共通的依赖。
例子7.12多项目构建-共通配置
build.gradle
subprojects {
apply plugin: 'java'
apply plugin: 'eclipse-wtp'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:4.11'
}
version = '1.0'
jar {
manifest.attributes provider: 'gradle'
}
}
注意,咱们在例子中给每一个子项目都应用了Java插件,这意味着,在先前章节所看到的任务和配置属性都适用于每一个子项目,所以你可以在根项目目录执行gradle build 来编译、测试这些项目,以及将它们输出为JAR包。
7.3.3项目间依赖
同一个构建中,可以在项目之间添加依赖,这样,一个项目的JAR文件可以用来编译另一个项目。我们在api目录下的构建文件中添加对由共享项目生成的JAR的依赖,因为这个依赖关系,Gradle会保证共享项目总会在api项目之前被构建出来。
例子7.13多项目构建-项目间依赖
api/build.gradle
dependencies {
compile project(':shared')
}
在56.7.1节,会看到“取消依赖“的功能。
7.3.4创建发布
我们也可以添加一个发布包,打包给客户端用。
例子7.14多项目构建-发布文件
api/build.gradle
task dist(type: Zip) {
dependsOn spiJar
from 'src/dist'
into('libs') {
from spiJar.archivePath
from configurations.runtime
}
}
artifacts {
archives dist
}