java构建入门
java插件The Java plugin
如你所见,Gradle是一个通用工具。它可以通过脚本构建任何你想要实现的东西,真正实现开箱即用,但前提是你需要在脚本里编写好代码才行。
大部分java项目基本流程都是相似的:编译源文件,进行单元测试,创建jar包。使用Gradle做这些工作不必为每个工程都编写代码。Gradle已经提供了完美的插件来解决这些问题。插件就是Gradle的扩展。简而言之就是为你添加一些非常有用的默认配置。Gradle自带了很多插件,而且你也可以很容易的编写和分享自己的插件。java plugin作为其中之一,为你提供了诸如编译,测试,打包等一些功能。
java插件为工程定义了许多默认值,如java源文件位置,如果你遵循这些默认规则,那么你无需在你的脚本文件中书写太多代码,当然Gradle也允许你自定义项目中的一些规则,实际上,由于对java工程的构建是基于插件的,那么你也可以完全不用插件自己编写代码来进行构建
现在了解java插件的基本用法:
一个基本java项目A basic Java project
using the java plugin
将下面代码添加到你的脚本里:
apply plugin: 'java'
只要一运行,会为你添加java插件和一些内置任务。
标准目录结构如下:
project
+build
+src/main/java
+src/main/resources
+src/test/java
+src/test/resources
gradle默认从src/main/java搜寻打包源码,在src/test/java下搜寻测试源码,在src/main/resources下的所有文件都会被打包,所有的src/test/resources下的文件都会被添加到类路径用以测试,所有文件都输出到build下,打包的文件都输出到build/libs下
gradle tasks列出任务列表
构建项目Building the project
java插件为你添加了众多任务,但是它们只是在你需要构建项目时候才能发挥作用。最常用的就是build任务,这会构建整个项目。当你执行gradle build时,Gradle会编译并执行单元测试,并且将src/main/*下面class和资源文件打包
运行gradle build的输出结果:
> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
其余一些较常见的任务有如下几个:
clean
assemble:编译并打包jar文件,但不会执行单元测试。一些其它插件可能会增强这个任务的功能,例如,如果采用了War插件,这个任务便会为你的项目打出War包。
check:编译并测试代码
外部依赖 External dependencies
通常一格java项目拥有许多外部依赖。你需要高数Gradle如何找到并引用这些外部文件。在Gradle中通常jar包都存在于仓库中。仓库可以用来搜寻依赖或发布项目产物,下面时一个采用Maven仓库的例子:
添加maven仓库:
build.gradle
repositories{
mavenCentral()
}
添加依赖:
dependencies{
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit' , name:'junit', version:'4.+'
}
自定义项目 customizing the project
java插件为你的项目增加了众多默认配置,这些默认配置通常对于一格普通项目来说已经够了。但如果你觉得不适用,修改起来也很简单.下面的例子,我们为java项目指定了版本号以及所用的JDK版本,并且添加一些属性到mainfest中。
自定义MAINFEST.MF
build.gradle
sourceCompatibility = 1.5
version = '1.0'
jar{
mainfest{
attributes 'Implementation-Title':'Gradle Quickstart' , 'Implementation-Version': version
}
}
java插件添加的都是一些普通任务,如同他们写在Build文件中一样,这意味着前面章节展示的机制都可以用来修改这些任务的行为。例如,可以设置任务的属性,添加任务行为,更改任务依赖,甚至是重写覆盖整个任务。
为test添加系统属性
build.gradle
test{
systemProperties 'property':'value'
}
发布jar包 Publishing the JAR file
如何发布Jar包?你需要告诉Gradle发布到哪。在Gradle中Jar包通常被发布到某个仓库,在下面的例子,我们会将Jar包发布到本地目录。当然你也可以发布到远程仓库或者多个远程仓库中。
发布jar包build.gradle
repositories{
flatDir{
dirs 'repos'
}
}
执行gradle uploadArchives以发布jar包
创建Eclipes文件 Creating an Eclipes project
若要把项目导入Eclipes中,你需要添加另外一格插件到你的脚本文件中。
Eclipes plugin
build.gradle
apply plugin: 'eclipes'
执行gradle eclipes来生成Eclipes项目文件
示例汇总:
build.gradle
apply plugin: 'java'
apply plugin: 'eclipes'
sourceCompatibility = 1.5
version = '1.0'
jar{
manifrst{
attribute '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'
}
}
}
多项目构建Multi-project Java build
现在来看一格典型的多项目构建的例子,项目结构如下:
Build layout:
multiproject/
api/
services/webservice/
shared/
此处共有三个工程。api工程用来生成给客户端用的jar文件,这个jar可以为XML webservice提供java客户端。webservice是一个web项目,生成XML。shared工程包含的是前面两个共成的公用代码
多项目构建定义:
定义一格多项目构建工程需要在根目录创建一个setting配置文件来指明构建包含那些项目。并且这个文件必须较setting.gradle,本例子的配置文件如下:
settings.gradle
include "shared", "api", "services:webservice", "services:shared"
公共配置 Common configuration
对于多项目构建而言,总有一些共同的配置。在本例中我们会在根项目上采用配置注入的方式定义一些公共配置。根项目就像一个容器,子项目会迭代访问它的配置并注入到自己的配置中。这样我们就可以简单的为所有工程定义主配置单了
多项目构建-公共配置
subprojects{
apply plugin: 'java'
apply plugin: 'eclipes-wtp'
}
repositories{
mavenCentral()
}
depencencies{
testCompile 'junit:junit:4.11'
}
version = '1.0'
jar{
manifrst.attributes provider: 'gradle'
}
值得注意的是我们为每个子项目应用了java插件,这意味着我们在前面章节学习的内容在子项目中也是可以用的,所以你可以在根项目目录进行编译,测试,打包等操作
工程依赖 Dependencies between projects
同一个构建中可以建立工程依赖。一个工程的jar包可以提供给另一个工程使用。例如我们可以让api工程依赖于shared工程的jar。这样Gradle在构建api之前总是会先构建shared工程
api/build.gradle
dependencies{
compile project(':shared')
}
打包发布 Creating a distribution
多项目构建-发布
api/build.gradle
task dist(type: Zip){
dependsOn spiJar
from 'src/dist'
into('libs'){
from spiJar.archivePath
from configurations.runtime
}
}