首先说一下软件的一个生命周期:
- 编译源代码
- 运行单元测试和集成测试
- 执行静态代码分析、生成分析报告
- 创建发布版本
- 部署到目标环境
- 部署传递过程
- 执行冒烟测试和自动功能测试
你有闲情逸致去手动执行每一个步骤吗?有了自动化构建工具你可以把每一个步骤定义成一个Task,任务之间可以相互依赖。
一、1、maven是什么?
是项目管理工具,当Maven运行的时候它向项目对象模型(POM)查看关于这个项目的信息。POM回答类似这样的问题:这个项目是什么类型的?这个项目的名称是什么?这个项目的构建有自定义么?
maven的目标:认为项目是可重复使用,易维护,也更容易理解的一个综合模型。
- 为什么用maven?
你的项目要用很多jar包,比如链接数据库用connector,写日志要用log4j,现在写程序都要用spring,下载个spring打开一看密密麻麻的jar包,你肯定不知道到底用哪个不用哪个,就算你把所有jar包都引进来,可能还不能运行,因为还要依赖其他jar包,如果想升级个spring,所有的jar包都要重来一便,你也不记得那些是有spring引进的jar包了。所以有了maven,你只要配置一下你要用的spring,所有的jar包都给你下载好了,你直接运行就行了,哪天升级了改个版本号就欧了。
- 1、Apache Ant 是什么?
Apache Ant 是一个基于 Java的生成工具。生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式)。
- 为什么要用ant。
打包的时候比如说配置文件中的用户名和密码,你本地开发和程序实际运行时的内容肯定不一致,所以需要有两个文件,开发的时候用一个,实际运行的时候用一个。这样每次打包的时候都要重复的做这些事,ant可以让你用xml的形式把这些事情写成脚本,然后自动运行。
三、然后用了maven,jar包是方便了,但我打包的时候还是有好多事要做啊,然后你会发现maven实在是不知道怎么做这些事,于是开始怀念ant。gradle就是又能干maven的活,又能干ant的活,用groove语言写脚本,表达能力还更强。
四、gradle是代替maven和Ant的下一代项目构建工具,gradle是一个像ant那样的构建工具,又有 maven 的依赖管理功能,通俗的讲gradle是一个依赖管理/自动化编译测试部署打包工具。
依赖管理简单地说就是你只用写一行代码就可以自动帮你把jar包下载下来并能被当前工程所使用。
自动化构建就是gradle可以通过一些命令去执行一些特有任务比如编译测试打包等等。
五、Gradle构建
1、首先在gradle中有两个最基本的概念Projects和tasks。Projects由多个tasks组成,task就是例如编译、打包、执行等原子性工作。
2、Gradle的构建分两个阶段,第一阶段是设置阶段,分析构建脚本,处理依赖关系和执行顺序等.第二阶段是执行阶段,此阶段真正构建项目并执行项目下的各个任务。
3、对gradle的构建进行配置,配置文件如下:
Gradle构建脚本(build.gradle)指定一个项目和他的任务。
Gradle属性文件(gradle.properties)配置构建属性。
Gradle设置文件(gradle.settings)多项目构建主要描述哪个项目参与构建。
4、Gradle插件介绍:
- 作用:在项目中添加新任务
- 为新加入的任务提供默认配置,这个默认配置会在项目中注入新的约定(如源文件位置)。
- 加入新的属性,可以覆盖插件的默认配置属性。
- 为项目加入新的依赖。
- 为项目加入gradle插件,在build.gradle文件中加入apply plugin:‘foo’。
5、实战-创建一个java项目
默认目录:
- src/main/java目录包含了项目的源代码。
- src/main/resources目录包含了项目的资源(如属性文件)。
- src/test/java目录包含了测试类。
src/test/resources目录包含了测试资源。
所有我们构建生成的文件都会在build目录下被创建,这个目录涵盖了以下的子目录: classes目录包含编译过的.class文件。
libs目录包含构建生成的jar或war文件。
就是这样,现在我们已经创建了一个Java项目。Java插件会在我们的构建中添加一些新的约定(如默认的项目结构),新的任务,和新的属性。
Java插件在我们的构建中加入了很多任务我门现在用到的如下:
assemble任务会编译程序中的源代码,并打包生成Jar文件,这个任务不执行单元测试。
- build任务会执行一个完整的项目构建。
- clean任务会删除构建目录。
- compileJava任务会编译程序中的源代码。
- 依赖管理:
首先是仓库管理,其实仓库无非是存放依赖的容器,每个项目都具备一个或多个仓库。
Gradle支持以下仓库格式:
Ivy仓库
不过我现在只知道maven仓库:Maven仓库就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源。
Maven仓库分为本地仓库和远程仓库
本地仓库配置:在build.gradle文件中加入:
repositories {
maven {
url "../maven-repo"
}
}
远程仓库配置:
repositories {
maven {
url "http://maven.petrikainulainen.net/repo"
}
}
在加入Maven仓库时,Gradle提供了三种“别名”供我们使用,它们分别是:
- mavenCentral()别名,表示依赖是从Central Maven 2 仓库中获取的。
- jcenter()别名,表示依赖是从Bintary’s JCenter Maven 仓库中获取的。
mavenLocal()别名,表示依赖是从本地的Maven仓库中获取的。
比如说:
repositories {
mavenCentral()
}
如何使用gradle管理项目的依赖
配置完项目仓库,我们可以声明其中的依赖,声明步骤:
第一步,指定依赖的配置:
在Gradle中,依赖是按照指定名称进行分类的,这些分类被称为配置项,我们可以使用配置项声明项目的外部依赖。
比如说Java插件指定了若干依赖配置项,其描述如下:
- 当项目的源代码被编译时,compile配置项中的依赖是必须的。
- runtime配置项中包含的依赖在运行时是必须的。
- testCompile配置项中包含的依赖在编译项目的测试代码时是必须的。
- testRuntime配置项中包含的依赖在运行测试代码时是必须的。
- archives配置项中包含项目生成的文件(如Jar文件)。
- default配置项中包含运行时必须的依赖。
第二步,声明项目依赖:
普遍的依赖称为外部依赖,这些依赖存放在外部仓库中。一个外部依赖可以由以下属性指定:
- group属性指定依赖的分组(在Maven中,就是groupId)。
- name属性指定依赖的名称(在Maven中,就是artifactId)。
- version属性指定外部依赖的版本(在Maven中,就是version)。
- 实战,演示程序:
- 创建二进制文件
大家都知道二进制发布版本,就是我们的应用该发布到服务器了。
(1)Application插件是一种gradle插件,让我们可以运行、安装应用程序并创建二进制发布版本。
步骤:
为项目应用application插件
apply plugin: 'application'
对应用程序主类进行配置,设置mainClassName属性
mainClassName = 'et.common.hello.HelloWorld'
然后Application插件在项目中添加5个任务:
- run任务用以启动应用程序。
- startScripts任务会在build/scripts目录中创建启动脚本,这个任务所创建的启 动脚本适用于Windows和*nix操作系统。
- installApp任务会在build/install/[project name]目录中安装应用程序。
- distZip任务用以创建二进制发布并将其打包为一个zip文件。可以在build/distributions目录下找到。
- distTar任务用以创建二进制发布并将其打包为一个tar文件。可以在build/distributions目录下找到。
- 在二进制发布版本中添加应用程序许可证
步骤:
License文件包含了我们应用程序的许可信息,可以在项目的根目录下找到他
a、 创建一个任务,将许可证从项目的根目录复制到build目录下
创建一个新的copy任务,起了一个名字叫copylicense,调用CopySpec接口中的from方法和into方法。
task copyLicense(type: Copy) {
from "LICENSE"
into "$buildDir"
}
但是此时这个任务并没有引入
b、将许可证加入到所创建的二进制发布的根目录下
1、将copyLicense任务从一个Copy任务改为正常的Gradle任务,只需在它的声明中移除“(type: Copy)”字符串。
2、按照以下步骤修改copyLicense任务
配置copyLicense任务输出。创建一个新的文件对象,指向build目录的许可证文件,并将其设置为outputs.file属性值。
将许可证文件从项目的根目录复制到build目录下。
3、 Application插件在项目中设置了一个CopySpec属性,名为applicationDistribution。我们可以使用这个属性在已创建的二进制文件中加入许可证文件,步骤如下:
使用CopySpec接口中的from()方法配置许可证文件的位置,将copyLicense任务的输出作为方法参数。
使用CopySpec接口中into()方法配置target目录,将一个空的字符串作为参数调用方法。
task copyLicense {
outputs.file newFile("$buildDir/LICENSE")
doLast {
copy {
from "LICENSE"
into "$buildDir"
}
}
}
applicationDistribution.from(copyLicense) {
into ""
}
- 演示
- 创建多项目构建:
到目前为止我们有两个模块
core模块包含一些通用的组件,它们能够被程序的其他模块使用。在我们的例子上,只包含一个类:MessageService类返回‘Hello World!’字符串。该模块只有一个依赖:它包含一个单元测试,使用Junit 4.11。
app模块包含HelloWorld类,是程序的开端,它从MessageService对象中获取信息,并将接收到的信息写入一个日志文件中。该模块拥有两个依赖:它需要core模块,还使用Log4j 1.2.17作为日志库。
(1)建立目录结构
建立core模块的根目录(core),并建立以下子目录:
- src/main/java目录包含core模块的源代码。
- src/test/java目录包含core模块的单元测试。
建立app模块的根目录(app),并建立以下子目录:
- src/main/java目录包含app模块的源代码。
- src/main/resources目录包含app模块的资源文件。
(2)多项目构建中的项目配置:
A、 在根目录下创建settings.gradle文件
确保app和core项目包含在多项目构建中
include 'app'
include 'core'
B、配置core
C、配置app
D、移除重复配置
共享配置:子项目之间必然会有相同的配置项,为了保持代码重用和整洁,gradle使用以下方式使不同的项目能够共享配置:.allprojects他是父项目的一个属性,用来配置所有项目包括父项目的共同配置。
给所有项目应用java插件。
allprojects {
//Add configuration here
}
Subprojects:用来配置所有子项目的共有配置,共同插件、repositories、依赖版本和配置
subprojects {
apply plugin: 'java'
repositories {
mavenCentral()
}
}
给所有子项目加上java插件,使用mavenCentral作为所有子项目的库,和对guava和junit的项目依赖。
扩展
Configure:只有部分子项目有共同配置
configure(subprojects.findAll {it.name.contains('war')}) {
apply plugin: 'war'
}
给有war关键字的所有子项目加上war插件。
独享配置:每个子项目的独有配置,在父项目的build.gradle文件通过project(‘:sub-project-name’)来设置对应子项目的配置,
project(‘:core’) {
ext{
hibernateVersion = ‘4.2.1.Final’
}
dependencies {
compile “org.hibernate:hibernate-core:${hibernateVersion}”
}
}
这是对于子项目相对较少的项目。
若一个项目较为复杂,子项目较多那么直接在每个子项目目录下为其建立一个build.gradle文件添加如下配置:
ext{
hibernateVersion = ‘4.2.1.Final’
}
dependencies {
compile “org.hibernate:hibernate-core:${hibernateVersion}”
}
- 创建web项目
使用java项目创建web项目,应用war插件
War插件在项目的目录布局下添加了一个新的目录,加入了两个新的依赖管理配置项,以及在项目中添加了一个新的任务。这些变化的详细描述如下:
War插件在项目的目录布局下添加了src/main/webapp目录,这个目录包含Web应用的源文件(CSS文件、Javascript文件、JSP文件等)。
War插件加入了两个新的依赖管理配置项providedCompile 和 providedRuntime.,这两个配置项与compile 和 runtime 配置项的作用域相同,但是区别是这两个配置项所属的依赖不会被添加到WAR文件中。
War插件也会在应用项目中添加war任务,这个任务会将WAR文件置于build/libs目录中。
运行web应用
我们可以使用Gretty在开发环境中运行Web应用。我们继续进行配置构建并使用Gretty运行Web应用。首先,必须配置构建脚本的依赖。可以通过以下步骤完成:
1. 使用Bintray的JCenter Maven仓库配置构建脚本,进行依赖解析。
2. 将Gretty插件的依赖加入到构建脚本的classpath中。