Gradle 和 Maven构建工具
构建工具的诞生帮我们省去了不少的事情,随着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表示。其中包含项目的基本信息,构建过程,环境信息,依赖信息等。我们可以看下面这个简单的例子:
//远程仓库
<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的构建清晰的分为三个阶段:
- 初始化阶段 Gradle提供了单项目和多项目的构建,在初始化阶段,他要决定哪些项目要参与到构建中来,并创建这些项目的实例
- 配置阶段 在这个阶段需要参与到本次构建的项目的构建脚本将会被执行,这些项目的对象将被配置,这个特性叫做configuration on demand
- 执行阶段 Gradle为在配置阶段创建和配置的任务再次筛选需要执行的任务的子集,这个子集的筛选是由在命令行下传递给Gradle的任务名和目录决定的,子集中的每个任务都会被执行
制品发布
在制品发布这个操作上,Maven要扳回一局。Maven原生支持maven jar的格式,发布很简单;而Gradle虽说既支持Maven又支持Gradle,但是就要我们自己做很多额外的工作。比如Maven要发布制品,只需要配置远程仓库的参数,但是Gradle需要先生成pom文件才可进行制品发布。
- lodash源码分析之缓存方式的选择
- 《物联网智能终端信息安全白皮书》发布
- SemCmsv2_4 Function_php文件过滤不严导致Sql注入
- Python为什么这么火?聆听Python之父诠释Python的精神和文化
- 阿里程序员2017年终总结:web前端最有效学习方法!让你少走弯路
- 《关于深化“互联网+先进制造业”发展工业互联网的指导意见》的系列解读 解读二:打造平台体系
- 2018最火的AI丶云计算丶大数据丶物联网丶量子计算五大热门之间的关系
- 人工智能或能帮助揭示永葆青春的秘密 寻减缓衰老药物
- 近百万的“荣耀”域名遭仲裁 两个终端的对决
- IT专业人员如何看待软件定义的数据中心市场
- 安正平:网络隐私保护不能止于关闭直播平台
- 摩拜与武汉地铁深度合作,网上买地铁票又多了一种渠道
- 从零推导神经网络之入门篇
- 支付宝红包到底是谁挣了?
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释