Maven与Gradle对比


5aea46e1dd9b5a643f01426591f1bc81.jpeg

背景

在Java项目的开发中,需要引入自动化构建工具来帮助我们管理项目的外部依赖包、项目编译、打包等工作。Gradle和Maven是Java世界中两个重要的自动化构建工具,在项目中我们在两者之间如何选择呢?两者有什么异同点呢?

Maven

介绍

Maven用于Java项目的自动化构建。它可以帮助开发者确定特定软件的构建方式及其不同的依赖关系。它使用XML文件描述正在构建的项目以及与第三方模块有关的软件依赖性,构建顺序以及所需的插件。可以提前定义打包和编译之类的任务。Maven将从不同的仓库下载库和插件,然后将它们全部放入本地计算机的缓存中。虽然主要用于Java项目,但是开发者可以将其用于Scala,Ruby和C#以及其他多种语言。

818c5d379f06050c4c84e8a4b529af79.jpeg

特点

  • 基于模型的构建:Maven能够根据项目的元数据将任意数量的项目构建到预定义的输出类型(如JAR,WAR或分发)中,而无需在大多数情况下执行任何脚本。
  • 站点的项目信息的连续性:使用与构建过程相同的元数据,Maven能够生成包含您需要添加的任何文档的网站或PDF,并添加有关项目开发状态的标准报告。在“项目信息”和“项目报告”子菜单下,可以在本网站左侧导航栏的底部看到此信息的示例。
  • 发布管理和发布发布:没有太多额外配置,Maven将与您的源代码控制系统(如Subversion或Git)集成,并根据特定标记管理项目的发布。它还可以将其发布到分发位置以供其他项目使用。Maven能够发布单个输出,例如JAR,包含其他依赖关系和文档的存档,或者作为源代码分发。
  • 依赖管理:Maven鼓励使用JAR和其他依赖项的中央存储库。Maven附带了一种机制,您的项目客户可以使用该机制从中央JAR存储库下载构建项目所需的任何JAR,就像Perl的CPAN一样。这允许Maven的用户跨项目重用JAR并鼓励项目之间的通信,以确保处理向后兼容性问题。

生命周期

Maven的生命周期就是对所有的构建过程进行抽象和统一。包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。Maven的生命周期是抽象的,即生命周期不做任何实际的工作,实际任务由插件完成,类似于设计模式中的模板方法。Maven有三套相互独立的生命周期,分别是clean、default和site。每个生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

3907b42760d1deb1aeb8c6e318163134.jpeg

clean生命周期:清理项目,包含三个phase。

  • pre-clean:执行清理前需要完成的工作
  • clean:清理上一次构建生成的文件
  • post-clean:执行清理后需要完成的工作

default生命周期:构建项目,重要的phase如下。

  • validate:验证工程是否正确,所有需要的资源是否可用。
  • compile:编译项目的源代码。
  • test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要打包和部署。
  • Package:把已编译的代码打包成可发布的格式,比如jar。
  • integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
  • verify:运行所有检查,验证包是否有效且达到质量标准。
  • install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
  • Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。

site生命周期:建立和发布项目站点,phase如下

  • pre-site:生成项目站点之前需要完成的工作
  • site:生成项目站点文档
  • post-site:生成项目站点之后需要完成的工作
  • site-deploy:将项目站点发布到服务器

仓库

Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。


59eee9b46f2b688667adb83145a81051.jpeg

Maven 仓库有三种类型:

  • 本地仓库(local):Maven 本地仓库默认被创建在 用户目录下。要修改默认位置,在 Maven安装目录中的 conf文件夹下的 settings.xml 文件中定义另一个路径
  • 中央仓库(central):Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的依赖库
  • 远程仓库(remote):在私有服务器在局域网内架设一个仓库代理。私服可以看作一种特殊的远程仓库,代理广域网上的远程仓库

Gradle

介绍

Gradle于2007年首次发布,并于2013年被Google用作Android项目的构建系统。它旨在支持非常庞大的工程构建。它也允许增量添加到项目构建中,因为它知道项目的哪些部分已更新。那些依赖于已经的任务将不再执行。目前,它支持使用Java,Scala和Groovy进行开发和后续部署,并在将来引入其他项目工作流和语言。

c0fa6fede12c0a02d7bc9505c2f9abe4.jpeg


特点

  • 声明式构建和合约构建:Gradle 的核心是基于 Groovy 的 领域特定语言 (DSL), 具有十分优秀的扩展性. Gradle 通过提供可以随意集成的声明式语言元素将声明性构建推到了一个新的高度. 这些元素也为 Java, Groovy, OSGi, Web 和Scala 等项目提供基于合约构建的支持
  • 基于依赖的编程语言:声明式语言位于通用任务图 ( general purpose task graph ) 的顶端,它可以被充分利用在你的构建中. 它具有强大的灵活性, 可以满足使用者对 Gradle 的一些特别的需求
  • 让构建结构化:Gradle 的易适应性和丰富性可让你在构建里直接套用通用的设计原则.
  • API深化:Gradle 允许你管理和定制它的配置和执行行为.
  • Gradle 扩展:Gradle 扩展得非常好. 不管是简单的独立项目还是大型的多项目构建, 它都能显著的提高效率
  • 多项目构建:Gradle 对多项目的支持是非常出色的. 项目依赖是很重要的部分. 它允许你模拟在多项目构建中项目的关系
  • 多种方式来管理你的依赖:Gradle 对于任何管理策略都提供了合适的支持
  • 构建整合:Gradle 可以直接引入Ant 项目, 并在运行时直接将 Ant targets 转换成 Gradle tasks.
  • 易于迁移:Gradle 可以兼容任何结构. 因此你可以直接在你的产品构建的分支上开发你的 Gradle 构建, 并且二者可以并行
  • Groovy编写脚本:Gradle 的构建脚本是通过 Groovy 编写的而不是 XML. 但是并不像其他方式, 这并不是为了简单的展示用动态语言编写的原始脚本有多么强大
  • Gradle 包装器:Gradle 包装器允许你在没有安装 Gradle 的机器上运行 Gradle 构建.

生命周期

Gradle的构建过程有着固定的生命周期,理解Gradle的生命周期和Hook点,有助于帮你梳理、扩展项目的构建流程。任何Gradle的构建过程都分为三部分:初始化阶段、配置阶段和执行阶段。

  • 初始化阶段:初始化阶段的任务是创建项目的层次结构,并且为每一个项目创建一个Project实例。
  • 配置阶段:配置阶段的任务是执行各项目下的build.gradle脚本,完成Project的配置,并且构造Task任务依赖关系图以便在执行阶段按照依赖关系执行Task。
  • 执行阶段:在配置阶段结束后,Gradle会根据任务Task的依赖关系创建一个有向无环图,可以通过Gradle对象的getTaskGraph方法访问,对应的类为TaskExecutionGraph,然后通过调用gradle <任务名>执行对应任务。


Gradle提供了非常多的钩子供开发人员修改构建过程中的行为,Gradle在构建的各个阶段都提供了很多回调,我们在添加对应监听时要注意,监听器一定要在回调的生命周期之前添加。



64c4a6c16dc91572cba494cf20f9d017.jpeg


仓库

Gradle 是在仓库的中寻所需的外部依赖。仓库即是一个按 group,name 和 version 规则进行存储的一些文件。Gradle 可以支持不同的仓库存储格式,如 Maven 和 Ivy,并且还提供多种与仓库进行通信的方式,如通过本地文件系统或 HTTP。


支持的类型有如下几种:

8bcba9c1b301e2555f5cdbc6f0062d97.jpeg


总结

Gradle和Maven两种构建方式存在一些根本差异,选择哪种构建工具取决于我们的实际需求。Gradle功能更强大,但是,有时候一个中小型的项目不需要它提供的大多数功能,则Maven可能就是最佳选择。而Gradle则是大型项目的最佳选择。如果一直在使用Maven,但发现项目越来越大,已经不适合使用Maven,这时候就可以从Maven迁移到Gradle。总而言之,Maven和Gradle两种构建工具有各自的优缺点。

  • 个性化编译:使用Maven,开发者可以轻松定义项目的元数据和依赖项,但是创建高度自定义的版本可能是Maven用户的噩梦。随着项目的增长,POM文件很容易膨胀,并且以后可能会成为无法读取的XML文件。
  • 依赖管理和目录结构:Maven提供了简单而有效的依赖关系管理,并且由于它具有项目的目录结构,因此所有项目都具有某种标准布局。它为其POM文件使用一个声明性XML文件,并具有许多可以使用的插件。Gradle使用Maven上相同的目录结构,但是可以自定义。它还使用了与Maven用来识别工件的GAV格式相同的格式。
  • 插件和集成:Maven具有很多的插件,并与第三方工具(例如CI服务器,代码覆盖插件和工件存储库系统)无缝集成。就插件而言,现在有越来越多的可用插件,并且有大型厂商具有与Gradle兼容的插件。
  • 灵活性:另一方面,Gradle非常灵活,并且基于脚本。自定义构建将很容易在Gradle上完成。
  • 性能方面:两者都允许多模块构建并行运行。但是,Gradle允许增量构建,因为它检查是否更新了哪些任务。如果是这样,则不执行任务,从而使构建时间大大缩短
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值