构建工具的诞生帮我们省去了不少的事情,随着Maven的出现,确实使我们眼前一亮,maven优化了上一代ant的复杂,给了我们一些目标,不需要我们将构建任务一个个的列出,同时它提供了依赖管理它通过简单的配置就可以自动从网络上下载项目所需的依赖,这革命性的改变了我们开发软件的方式。它为基于制品的协作提供了可能。
同时到目前为止Maven任然是构建工具的标准
但是技术总是在涌现,当项目非常巨大是众多的xml配值看起来也是十分的混乱与麻烦,没多久gradle出现了,基于Groovy的Gradle一出现,Hibernate就将自己的项目从Maven迁移到了Gradle,Google官方Android开发的IDE Android Studio也默认使用了Gradle进行构建。
gradle优点
- 灵活性 谷歌采用gradle构建andriod不是因为构建(简洁)脚本就是代码,而是因为gradle是可扩展的。比如gradle允许调用C/C 进行native 开发。另外,gradle可以扩展到其他生态圈,比如可以嵌入其他系统,因为gradle提供了一套tooling api。 Gradle和maven都遵循约定大于配置,但是maven的模型比较僵硬,一些个性化配置很难实现甚至不可能。
- 性能高 加快build速度对项目发布很重要,gradle和maven都采用了并行编译,并行依赖处理等方案。gradle的最大不同是避免不需要的工作和渐进性。主要采用以下三点:
a. 渐进性 gradle 记录任务的输入和输出,仅仅运行必须的,尽可能仅仅处理更高的文件 b. 利用cache gradle对于相同的输入,重用其他gradle build输出的cache,对于跨机器的构建也可以。 c. Daemon进程 gradle长期运行一个进程把build信息保存在内存
- 依赖管理更强 Maven和gradle都支持依赖管理,都可以本地缓存或者远程下载,maven 重写依赖仅仅允许修改版本,但是gradle提供了 “依赖选择”和“替代机制”(声明一次,整个工程都生效),替换机制可以利用多个project生成复合build。
依赖管理
Maven的配置文件是.pom文件。POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示。其中包含项目的基本信息,构建过程,环境信息,依赖信息等。我们可以看下面这个简单的例子:
代码语言:javascript复制//远程仓库
<project ...>
<repositories>
<repository>
<id>java.net</id>
<url>https://maven.java.net/content/repositories/public/</url>
</repository>
</repositories>
</project>
//依赖信息
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
当建立一个Maven的项目,pom.xml文件将被解析,如果看到 log4j 的 Maven 坐标,然后 Maven 按此顺序搜索 log4j 库: 在 Maven 的本地仓库搜索 log4j 在 Maven 中央存储库搜索 log4j 在 Maven 远程仓库搜索 log4j(如果在 pom.xml 中定义)
<parent>表示继承制品的配值信息,<dependency>表示项目依赖的其他制品,mvn install 就会自动下载依赖,并添加进本地仓库。
代码语言:javascript复制apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
testCompile group: 'junit', name: 'junit', version: '4. '
}
Gradle使用了groovy作为它的DSL,非常的易用。如果你使用了很久的Maven,你也许会发现Gradle的配置写起来实在是太爽了! 同时Gradle 支持jar的替换机制
代码语言:javascript复制configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
if (details.requested.name == 'groovy-all') {
//prefer 'groovy' over 'groovy-all':
details.useTarget group: details.requested.group, name: 'groovy', version: details.requested.version
}
if (details.requested.name == 'log4j') {
//prefer 'log4j-over-slf4j' over 'log4j', with fixed version:
details.useTarget "org.slf4j:log4j-over-slf4j:1.7.10"
}
}
}
生命周期
Maven生命周期 Maven有以下三种标准的生命周期:1. clean 2. default(或 build) 3. site
Maven 清洁目标(clean:clean)被绑定清洁干净的生命周期阶段。clean:clean 目标删除 build 目录下的构建输出。因此,当 mvn clean 命令执行时,Maven会删除编译目录。
当一个阶段是通过 Maven命令调用,例如:mvn compile,只有阶段到达并包括这个阶段才会被执行。
不同的 Maven 目标绑定到 Maven生命周期的不同阶段这是这取决于包类型(JAR/WAR/EAR)。
Gradle的构建清晰的分为三个阶段:
- 初始化阶段 Gradle提供了单项目和多项目的构建,在初始化阶段,他要决定哪些项目要参与到构建中来,并创建这些项目的实例
- 配置阶段 在这个阶段需要参与到本次构建的项目的构建脚本将会被执行,这些项目的对象将被配置,这个特性叫做configuration on demand
- 执行阶段 Gradle为在配置阶段创建和配置的任务再次筛选需要执行的任务的子集,这个子集的筛选是由在命令行下传递给Gradle的任务名和目录决定的,子集中的每个任务都会被执行
制品发布
在制品发布这个操作上,Maven要扳回一局。Maven原生支持maven jar的格式,发布很简单;而Gradle虽说既支持Maven又支持Gradle,但是就要我们自己做很多额外的工作。比如Maven要发布制品,只需要配置远程仓库的参数,但是Gradle需要先生成pom文件才可进行制品发布。