构建工具的诞生帮我们省去了不少的事情,随着Maven的出现,确实使我们眼前一亮,maven优化了上一代ant的复杂,给了我们一些目标,不需要我们将构建任务一个个的列出,同时它提供了依赖管理它通过简单的配置就可以自动从网络上下载项目所需的依赖,这革命性的改变了我们开发软件的方式。它为基于制品的协作提供了可能。
但是技术总是在涌现,当项目非常巨大是众多的xml配值看起来也是十分的混乱与麻烦,没多久gradle出现了,基于Groovy的Gradle一出现,Hibernate就将自己的项目从Maven迁移到了Gradle,Google官方Android开发的IDE Android Studio也默认使用了Gradle进行构建。
a. 渐进性 gradle 记录任务的输入和输出,仅仅运行必须的,尽可能仅仅处理更高的文件 b. 利用cache gradle对于相同的输入,重用其他gradle build输出的cache,对于跨机器的构建也可以。 c. Daemon进程 gradle长期运行一个进程把build信息保存在内存
Maven的配置文件是.pom文件。POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示。其中包含项目的基本信息,构建过程,环境信息,依赖信息等。我们可以看下面这个简单的例子:
//远程仓库
<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 就会自动下载依赖,并添加进本地仓库。
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的替换机制
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的构建清晰的分为三个阶段:
在制品发布这个操作上,Maven要扳回一局。Maven原生支持maven jar的格式,发布很简单;而Gradle虽说既支持Maven又支持Gradle,但是就要我们自己做很多额外的工作。比如Maven要发布制品,只需要配置远程仓库的参数,但是Gradle需要先生成pom文件才可进行制品发布。