Gradle相对于Maven有哪些优点

一、Gradle介绍

Gradle和Maven作为自动构建工具,在项目的构建中有着广泛的应用。他们之间有各自的优缺点,这里我们讨论下他们在项目构建中的一些区别并进行比较。

首先简单介绍下Gradle和Maven。Maven主要服务于基于java平台的项目构建、依赖管理和项目信息管理。无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发还是流行的敏捷模式,Maven都能大显身手。Gradle是以groovy语言为基础,面向java应用为主,基于DSL语法的自动化构建工具。

虽然两种构建工具有着很多相似处,但是在依赖管理、构建生命周期、加载构建系统组件等许多方面两者有着许多区别。Maven使用XML来定义生成脚本,而 Gradle构建脚本是用Groovy。 用XML的优势在于它可以更方便地定义构建逻辑,但这是比较复杂的步骤。 用Groovy的好处是写起来比XML标签要简洁许多。 不过熟悉的XML的开发人员比groovy的多,并且复杂的逻辑必须由自己编写。类似于Maven的pom.xml文件,每个Gradle项目都需要有一个对应的build.gradle文件,该文件定义一些任务(task)来完成构建工作,当然,每个任务是可配置的,任务之间也可以依赖,用户亦能配置缺省任务。

二、依赖管理

通常的Maven项目有一个单一的依赖的静态配置, 所以一个项目应该只有一个单一的Artifact。 因此其具备了简单的特点但同时也由于单一缺乏弹性。 Gradle在这方面的更灵活, 可以在创建和处理的时候有多套依赖配置。这里我们举一个例子,原本的Maven POM配置是:

<properties>
 <kaptcha.version>2.3</kaptcha.version>
</properties>

<dependencies>
 <dependency>
  <groupId>com.google.code.kaptcha</groupId>
  <artifactId>kaptcha</artifactId>
  <version>${kaptcha.version}</version>
  <classifier>jdk15</classifier>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
 </dependency>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
 </dependency>
</dependencies>

然后我将其转换成Gradle脚本,结果是惊人的:

dependencies {
 compile('org.springframework:spring-core:2.5.6')
 compile('org.springframework:spring-beans:2.5.6')
 compile('org.springframework:spring-context:2.5.6')
 compile('com.google.code.kaptcha:kaptcha:2.3:jdk15')
 testCompile('junit:junit:4.7')
}

我们可以发现配置代码减少为原来的四分之一。这还不算我省略的一些父POM配置。最重要的是依赖的groupId、artifactId、 version,scope甚至是classfier,一点都不少。并且Gradle能够解析现有的Maven POM或者Ivy的XML配置,从而得到传递性以来的信息,并且引入到当前项目中,它也支持排除传递性依赖或者干脆关闭传递性依赖,Gradle当你排除一项任务时,所有依赖于此任务的任务都会自动被排除如果他们之间没有其他依赖关系,这是Maven所不具备的特性。

三、加载构建系统的组件

Maven中每个用于构建的组件(编译/jar等)都作为一个插件, 每个插件都有它自己的版本和依赖关系树。 Gradle的构建系统组件都是分散的。 Maven插件的优点是在于可以独立更新,无需整个系统更新。Gradle的模型的优点是编译需要核心组件以外的组件时才下载。与此同时Gradle给了用户足够的自由去定义自己的任务,Gradle每个任务都有一个描述,可以分配到一个组。Maven中插件和命令可以描述。比如Gradle你可以排除任何运行的任务。在Maven中没有通用的排除机制,必须用插件来实现它。而且Gradle具有高级任务排序的特性,任务之间的依赖关系被建立之后能够得到完全控制,因为Gradle具有强大的语言结构来描述任务之间的执行顺序,即使任务并不取决于对方的输出。Gradle支持动态任务创建,有时你想要一个任务的行为取决于或无限价值的大范围的参数。一个很好的表达方式提供这样的任务是任务规则。并且执行任务时,Gradle 在遇到第一次失败时不停止,执行每一个要执行的任务其中所有的任务依赖关系都要被完成且没有失败。任务可以被分配去完成其他任务类似于java中的终结原则。他们总是在另一个任务执行之后运行,不管这个任务是否失败了。可以发现在一个单一的执行中许多失败任务会被很好地记录成一个错误报告并最终被汇总。

四、构建生命周期

Maven提供有限的构建生命周期访问,插件可以连接到生命周期的特定阶段,而且只有在核心插件执行。而Gradle可以访问生成的一部分并允许用Groovy代码进行处理。Gradle Java Plugin也定义了构建生命周期,包括编译主代码、处理资源、编译测试代码、执行测试、上传归档等等任务,Gradle的构建生命周期如下图:

相对于Maven完全线性的生命周期,Gradle的构建生命周期略微复杂,不过也更为灵活,例如jar这个任务是用来打包的,它不像Maven那样依赖于执行测试的test任务,类似的,从图中可以看到,一个最终的build任务也没有依赖于uploadArchives任务。这个生命周期并没有将用户限制得很死,由于Gradle完全是基于灵活的任务模型,因此很多事情包括覆盖现有任务,跳过任务都非常易于实现。而这些事情,在Maven的世界中,实现起来就比较的麻烦,或者说Maven就不希望用户这么做。

除了以上几个Maven核心内容与Gradle的区别,在面向对象输出模式,GUI操作界面、声明元素等方面Gradle也有良好表现。构建输出是构建用户体验的重要部分。在其他大多数构建工具中默认输出对于一个构建作者试图调试一个问题来说是有关联的。这通常会导致一个非常详细的输出会隐藏重要的警告和消息实际上是相关的开发人员运行构建。Gradle的默认输出是针对开发人员运行构建和只显示消息相关的情况下而不是滥用日志输出作为一种进度,例如在执行测试的时候。构建输出为构建用户体验是非常重要的。如果你与外部工具和库集成他们的控制台输出可能非常冗长。Gradle系统中你可以定义每个外部工具结合的日志级别的输出应该被路由。Gradle提供GUI操作界面,这是一个独立的用户界面,可以启动GUI选项,通过自定义日志模式你可以替换它的日志与自己的UI。Gradle有许多细粒度的声明性元素,如SourceSets或Android Product Flavors。它们的核心Gradle DSL然后让Gradle构建语言更加丰富。他们不断构建简洁、易于使用、维护和理解即使你有复杂的需求。Maven没有细粒声明元素,这是Maven极端顽固的主要原因。在Gradle,每个插件都可以提供自己的粗或细粒声明元素。这使你可以提供一个声明性方法甚至定制域。它还允许其他技术集成在Gradle中,让它被更多人使用。

整体来讲,Gradle给人一种简洁灵活的体验,然而必须掌握groovy也是他的问题,而且由于其灵活性,导致人们更容易破坏约定以至于让构建变得难以理解。但是Gradle确实是Maven理念的优秀实现。如果足够了解Groovy,也理解Maven的配置和构建,Gradle会是绝佳选择,尤其是它几乎能和现有的Maven系统无缝集成,而且你也能享受到简洁带来的极大乐趣,相信Gradle作为后起之秀在今后能够被完善的更好。

以上就是Gradle相对于Maven有哪些优点的详细内容,更多关于Gradle和Maven的资料请关注我们其它相关文章!

(0)

相关推荐

  • springboot maven 项目打包jar 最后名称自定义的教程

    maven 文件打包,输入 :package -Dmaven.test.skip=true 进行打包, 一般生成的jar 文件 名称是项目名+版本号这样的 如何在pom.xml 中加入finalname 属性,就可以获得稳定的jar 名称 <build> <finalName>pay</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId

  • 解决执行maven命令时提示Process terminated的问题

    一般出现这个错误,是由maven配置文件 settings.xml 中有错误(比如缺少起始标签或结束标签.起始标签和结束标签名称不一致.缩进或者空格不对)引起的. 解决方法: 使用idea打开 maven配置文件 settings.xml,检测报错的地方,修正错误后重新执行maven命令即可. 补充知识:idea的maven项目clean之后install发现打好的jar包为空(已解决) (1)勾选红框中的选项 (2)开启项目运行时自动build,在打开的页面上快捷键(maintenance)c

  • Android Studio新建工程默认在build.gradle中加入maven阿里源的问题

    背景: 在安卓开发时,我们时常会因为gradle时间漫长感到烦恼.通常情况下我们会在build.gradle(Project:MyApplication)中的repositories里添加阿里源,如下图所示. 而每次新建工程依然是google()和jcenter(),而且新建后自动帮你Sync,如果网速不佳则是等了好久才编译好一个新的工程. 解决方案: Android Studio新建工程自动加入maven阿里源 版本:笔者用的是AndroidStudio 3.4,其他版本略同 找到Androi

  • 解决idea2020.2遇到pom.xml文件报错maven插件tomcat7的问题

    之前百度找答案,指明的是依赖中servlet-api中添加provided 发现自己的依赖中已添加,未找到解决办法. 显示红色报错,阿里云仓库无法下载该文件.报错如下: 找到文件位置,删除maven本地仓库文件 解决办法:指定版本信息2.2 到此这篇关于idea2020.2遇到pom.xml文件报错maven插件tomcat7的问题的文章就介绍到这了,更多相关idea2020.2报错maven插件tomcat7内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • Java如何通过Maven管理项目依赖

    项目的依赖 Java最大的一个优势之一应该是整个生态中无数的框架和API,我们创建实际的项目不可避免的都需要用到这些框架和API,而它们通常都是以JAR包的形式提供.我们之前在编译项目的时候,需要在classpath上存放依赖的JAR包.而且这些外部的JAR包还会有其他依赖.我们需要递归地一个个去下载所有这些外部依赖,并且要确保下载的版本都是正确的,当项目越来越复杂的时候,这是极其麻烦的事情,比如碰到JAR Hell的问题. Maven现在来拯救我们了,Maven可以自动帮我们做依赖管理,我们需

  • IDEA配置java开发环境(maven、gradle、tomcat)

    idea安装好以后,是需要简单的配置一下的,而且要分不同的开发环境,此处就不多扩展了,我们就一起来配置java的开发环境 准备: 1.jdk环境配置 ------- java环境变量请参考(linux环境下java开发环境配置 或 windows环境下java开发环境配置) 2.maven build工具(maven项目使用),下载地址,本地下载地址 3.gradle build工具(gradle项目使用),下载地址,本地下载地址 4.tomcat 8.x ,下载地址,本地下载地址 内容: 一.

  • 详解阿里云maven镜像库配置(gradle,maven)

    经常使用maven远程仓库里jar包的同学,最头疼的事情莫过于加了jar包依赖配置之后,需要漫长的下jar包的过程,因为maven仓库网站是国外网站,速度非常的慢.在国内下好jar包放到本地再加载又过于麻烦. 以前有个oschina的国内maven镜像仓库地址,现在应该是弃用了(害得我也等了半天)现在国内的话主要使用阿里云的maven镜像仓库,速度很快~~~ gradle配置:将原来的mavenCentral()直接替换掉或者放到这个的前面(默认是从上往下寻找,所以要放到mavenCentral

  • IDEA2020.2创建springboot项目卡死在reading maven project的问题

    解决方法一 问题描述: 昨天更新IDEA2020.2版本后,创建springboot项目的时候发现一直在reading maven project 中,如下图,而且一点setting(想修改本地maven路径)时,IDEA就卡死,而且打开任务管理器发现IDEA高占CPU. 原因: 猜测是2020.2版本问题,用其他版本没有出现这类情况. 由于第一次用spring Initializr创建maven的项目,它不会找IDEA自带的maven,也不会找你配置的本地maven,而是重新下载一个全新的ma

  • Gradle使用Maven仓库的方法

    本文介绍了Gradle使用Maven仓库的方法,分享给大家,具体如下: 在build.gradle文件中, 修改repositories如下: repositories { mavenLocal() mavenCentral() } 这样的话, 就会优先从maven的仓库中查找所需的jar包 我的maven配置本地仓库为D:\repository中(见底部的"如何修改maven本地仓库地址"), 为防止下载到C盘默认的目录下, 建议将setting.xml复制一份到C:\Users\用

  • Gradle相对于Maven有哪些优点

    一.Gradle介绍 Gradle和Maven作为自动构建工具,在项目的构建中有着广泛的应用.他们之间有各自的优缺点,这里我们讨论下他们在项目构建中的一些区别并进行比较. 首先简单介绍下Gradle和Maven.Maven主要服务于基于java平台的项目构建.依赖管理和项目信息管理.无论是小型的开源类库项目,还是大型的企业级应用:无论是传统的瀑布式开发还是流行的敏捷模式,Maven都能大显身手.Gradle是以groovy语言为基础,面向java应用为主,基于DSL语法的自动化构建工具. 虽然两

  • Gradle的基本使用

    一.Gradle相比Maven的优势 配置简洁 Maven是用pom.xml管理,引入一个jar包至少5行代码,Gradle只需要一行. 构建速度快 Gradle支持daemon方式运行,启动速度快,同时有基于daemon的增量构建,充分利用JVM的运行时优化,和缓存数据构建速度相比Maven快很多. 更好的灵活性.扩展性 Gradle 相对于 Maven 等构建工具, 其提供了一系列的 API 让我们有能力去修改或定制项目的构建过程. 二.基本配置 设置本地仓库地址 默认本地仓库地址是:~/.

  • Java中的maven和gradle的比较与使用详解

    目录 1 构建工具的简单介绍 2 maven.gradle的简单使用方法 2.1 创建maven项目 2.2 maven的使用 2.3 gradle的使用 3 总结 1 构建工具的简单介绍 在代码世界中有三大构建工具,ant.Maven和Gradle.现在的状况是maven和gradle并存,gradle使用的越来越广泛.Maven使用基于XML的配置,Gradle采用了领域特定语言Groovy的配置.在Maven中要引入一个依赖,如下面的例子: <properties> <kaptch

  • Gradle快速安装及入门

    1.什么是Gradle Gradle是一种结合了Ant和Maven两者优势的下一代构建工具,既有Ant构建灵活性的优点,也保留Maven约定优于配置的思想,在灵活构建和约定构建之间达到了很好的平衡. 2.安装Gradle (1)Gradle属于解压配置即可使用的软件 下载解压gradle-4.1-all.zip,例如解压到:D:/ gradle-4.1 (2)window中设置gradle环境变量: GRADLE_HOME    D:/ gradle-4.1 path              

  • 为Android Studio编写自定义Gradle插件的教程

    Google已经建议Android开发全部转向Android Studio开发,Android Studio 是使用gradle编译.打包的,那么问题来了,gradle可是有一堆东西...,为了彻底了解gradle,今天就来学习下如何写自己的gradle插件(当然插件源码是使用groovy写的),先看如下代码目录: 如上图所示,plugin目录是插件源码目录,sample是用来测试插件的. 1.在目录plugin/src/main/groovy/com/micky/gradle/下新建插件类My

  • 使用Gradle做Java代码质量检查的方法示例

    Maven --> Gradle 首先安装gradle: Mac安装 brew install gradle Ubuntu安装 apt install gradle Maven项目切换Gradle项目,再Maven根目录下运行: gradle init --type pom 运行成功之后运行命令gradle build,成功之后删除pom.xml即可. 使用jacoco分析单元测试 jacoco是一个分析单元测试覆盖率的工具,使用它运行单元测试后,可以给出代码中那些部分被单元测试到,哪些部分没有

  • java如何使用自己的maven本地仓库详解

    本地仓库 主要是一种缓存,当你使用远程仓库中下载组件后,它下一次会优先从本地进行加载,一般位于USER_HOME/.m2目录下,我们自己也可以建立公用的包,把包发布到本地仓库,自己在其它项目里直接可以用,当然如果希望在任务地方都使用自己的包,需要把它发布到远程仓库中. 像nuget,npm一样maven也是仓库 Jar的maven配置 <dependency> <groupId>javalindday</groupId> <artifactId>jpaDem

  • 给Android初学者的Gradle知识普及

    Gradle build android 历史 Android Tools 主页 ,大概是2016年2月份发布 adt21.1 的时候,忽然在主页发现了New Build System 原来是可以用gradle 来构建android项目,至于gradle是什么(既然点击进来看了应该都知道了吧.).然后,又看了一下RoadMap 那时候,还并不支持Proguard 打包,于是就没看了. android studio 发布,终于gradle 0.4 也跟着出来了,于是,先把gradle 学了一遍,然

  • IDEA使用Gradle构建SpringBoot项目工程的详细教程

    背景 最近在研究搭建spring源码调试环境时,接触到到gradle项目构建工具.由于之前习惯于maven项目的构建,故通过此文记录相关gradle的项目构建知识. Gradle Gradle是一个构建工具,用于管理项目依赖和构建项目工程.Gradle抛弃了Maven的基于XML的繁琐配置,采用特定语言Groovy的配置,大大简化了构建代码的行数. 项目结构 Plugin Sample pluginManagement { repositories { gradlePluginPortal()

随机推荐