Gradle
https://gradle.org/
Gradle介绍
- 像Ant一样,通用灵活的构建工具
- 可以切换的,基于约定的构建框架
- 强大的多工程构建支持
- 基于Apache Ivy的强大的依赖管理
- 支持maven, Ivy仓库
- 支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件。
- 对Ant的任务做了很好的集成
- 基于Groovy,build脚本使用Groovy编写
- 有广泛的领域模型支持构建
Gradle 概述
Gradle 安装
- 二进制文件
- 用户手册(包括PDF和HTML两种版本)
- DSL参考指南
- API手册(包括Javadoc和Groovydoc)
- 样例
- 源代码,仅供参考使用。
Java世界中主要有三大构建工具:Ant、Maven和Gradle。经过几年的发展,Ant几乎销声匿迹、Maven也日薄西山,而Gradle的发展则如日中天。笔者有幸见证了Maven的没落和Gradle的兴起。Maven的主要功能主要分为5点,分别是依赖管理系统、多模块构建、一致的项目结构、一致的构建模型和插件机制。我们可以从这五个方面来分析一下Gradle比起Maven的先进之处。
依赖管理系统
Maven为Java世界引入了一个新的依赖管理系统。在Java世界中,可以用groupId、artifactId、version组成的Coordination(坐标)唯一标识一个依赖。任何基于Maven构建的项目自身也必须定义这三项属性,生成的包可以是Jar包,也可以是war包或者ear包。一个典型的依赖引用如下所示:
1 2 3 4 5 6 7 8 9 10 |
|
从上面可以看出当引用一个依赖时,version可以省略掉,这样在获取依赖时会选择最新的版本。而存储这些组件的仓库有远程仓库和本地仓库之分。远程仓库可以使用世界公用的central仓库,也可以使用Apache Nexus自建私有仓库;本地仓库则在本地计算机上。通过Maven安装目录下的settings.xml文件可以配置本地仓库的路径,以及采用的远程仓库的地址。
Gradle在设计的时候基本沿用了Maven的这套依赖管理体系。不过它在引用依赖时还是进行了一些改进。首先引用依赖方面变得非常简洁。
1 2 3 4 |
|
第二,Maven和Gradle对依赖项的scope有所不同。在Maven世界中,一个依赖项有6种scope,分别是complie(默认)、provided、runtime、test、system、import。而grade将其简化为了4种,compile、runtime、testCompile、testRuntime。那么如果想在gradle使用类似于provided的scope怎么办?别着急,由于gradle语言的强大表现力,我们可以轻松编写代码来实现类似于provided scope的概念(例如How to use provided scope for jar file in Gradle build?)。
第三点是Gradle支持动态的版本依赖。在版本号后面使用+号的方式可以实现动态的版本管理。
第四点是在解决依赖冲突方面Gradle的实现机制更加明确。使用Maven和Gradle进行依赖管理时都采用的是传递性依赖;而如果多个依赖项指向同一个依赖项的不同版本时就会引起依赖冲突。而Maven处理这种依赖关系往往是噩梦一般的存在。而Gradle在解决依赖冲突方面相对来说比较明确。在Chapter 23. Dependency Management 中的23.2.3章节详细解读了gradle是如何处理版本冲突的。
多模块构建
在SOA和微服务的浪潮下,将一个项目分解为多个模块已经是很通用的一种方式。在Maven中需要定义个parent POM作为一组module的聚合POM。在该POM中可以使用<modules>
标签来定义一组子模块。parent POM不会有什么实际构建产出。而parent POM中的build配置以及依赖配置都会自动继承给子module。
而Gradle也支持多模块构建。而在parent的build.gradle中可以使用allprojects和subprojects代码块来分别定义里面的配置是应用于所有项目还是子项目。对于子模块的定义是放置在setttings.gradle文件中的。在gradle的设计当中,每个模块都是Project的对象实例。而在parent build.gradle中通过allprojects或subprojects可以对这些对象进行各种操作。这无疑比Maven要灵活的多。
比如在parent的build.gradle中有以下代码:
1 2 3 |
|
执行命令gradle -q hello
会依次打印出父module以及各个submodule的项目名称。这种强大的能力能让gradle对各个模块具有更强的定制化。
一致的项目结构
在Ant时代大家创建Java项目目录时比较随意,然后通过Ant配置指定哪些属于source,那些属于testSource等。而Maven在设计之初的理念就是Conversion over configuration(约定大于配置)。其制定了一套项目目录结构作为标准的Java项目结构。一个典型的Maven项目结构如下:
Gradle也沿用了这一标准的目录结构。如果你在Gradle项目中使用了标准的Maven项目结构的话,那么在Gradle中也无需进行多余的配置,只需在文件中包含apply plugin:'java'
,系统会自动识别source、resource、test srouce、 test resource等相应资源。不过Gradle作为JVM上的构建工具,也同时支持groovy、scala等源代码的构建,甚至支持Java、groovy、scala语言的混合构建。虽然Maven通过一些插件(比如maven-scala-plugin)也能达到相同目的,但配置方面显然Gradle要更优雅一些。
一致的构建模型
为了解决Ant中对项目构建活动缺乏标准化的问题,Maven特意设置了标准的项目构建周期,其默认的构建周期如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
而这种构建周期也是Maven最为人诟病的地方。因为Maven将项目的构建周期限制的太死,你无法在构建周期中添加新的phase,只能将插件绑定到已有的phase上。而现在项目的构建过程变得越来越复杂,而且多样化,显然Maven对这种复杂度缺少足够的应变能力。比如你想在项目构建过程中进行一项压缩所有javascript的任务,那么就要绑定到Maven的现有的某个phase上,而显然貌似放在哪个phase都不太合适。而且这些phase都是串行的,整个执行下来是一条线,这也限制了Maven的构建效率。而Gradle在构建模型上则非常灵活。在Gradle世界里可以轻松创建一个task,并随时通过depends
语法建立与已有task的依赖关系。甚至对于Java项目的构建来说,Gradle是通过名为java
的插件来包含了一个对Java项目的构建周期,这等于Gradle本身直接与项目构建周期是解耦的。
插件机制
Maven和Gradle设计时都采用了插件机制。但显然Gradle更胜一筹。主要原因在于Maven是基于XML进行配置。所以其配置语法太受限于XML。即使实现很小的功能都需要设计一个插件,建立其与XML配置的关联。比如想在Maven中执行一条shell命令,其配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
而在Gradle中则一切变得非常简单。
1 2 3 |
|
在创建自定义插件方面,Maven和Gradle的机制都差不多,都是继承自插件基类,然后实现要求的方法。这里就不展开说明。
从以上五个方面可以看出Maven和Gradle的主要差异。Maven的设计核心Convention Over Configuration
被Gradle更加发扬光大,而Gradle的配置即代码
又超越了Maven。在Gradle中任何配置都可以作为代码被执行的,我们也可以随时使用已有的Ant脚本(Ant task是Gradle中的一等公民)、Java类库、Groovy类库来辅助完成构建任务的编写。
这种采用本身语言实现的DSL对本身语言项目进行构建管理的例子比比皆是。比如Rake和Ruby、Grunt和JavaScript、Sbt和Ruby…..而Gradle之所以使用Groovy语言实现,是因为Groovy比Java语言更具表现力,其语法特性更丰富,又兼具函数式的特点。这几年兴起的语言(比如Scala、Go、Swift)都属于强类型的语言,兼具面向对象和函数式的特点。
相关推荐
在Java生态系统中,Maven和Gradle是最常用的两种构建工具。本篇文章将深入探讨如何将一个基于Maven的项目转换为Gradle格式,以及为何会有这样的需求。 Maven是一款由Apache软件基金会开发的项目管理和综合工具,它...
Gradle插件,创建一个UploadArchives任务,自动将所有Java、Kotlin或Android库上载到任何Maven实例。这个插件基于chris-banes的初始实现,并且已经被增强以添加kotlin支持并跟上最新的更改。
首先,Android Maven Gradle 插件是Gradle生态系统中的一员,它允许Android开发者利用Maven的便利性,如仓库管理和依赖解析,同时享受Gradle强大的构建自动化功能。这一插件使得Android项目可以无缝地与Maven仓库...
【maven】说明:Gradle maven工件发布与maven、maven发布、android maven Gradle插件的演练。该项目包含..., (Gradle maven artifacts publishing walkaround with maven , maven-publish , android-maven gradle ...
主要介绍了详解阿里云maven镜像库配置(gradle,maven),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它提供了许多功能来帮助开发者构建、测试和部署Android应用程序。Gradle Metadata是Gradle的一个组件,负责管理项目的依赖关系和项目构建过程。...
Maven和Gradle是两种广泛使用的Java项目构建工具,它们各自有着独特的优势。本篇文章将详细探讨如何使用Maven来构建一个包含Gradle AspectJ功能的jar文件。 首先,让我们了解一下Maven。Maven是一种基于项目对象...
这个插件对于那些同时使用Gradle和Maven的项目尤其有用,因为它实现了两者的互操作性,使得开发团队可以利用Gradle的强大功能,同时确保工件能够被Maven生态系统接受和使用。 在Android开发中,Gradle是首选的构建...
SpringBoot、Gradle、Maven、Java和Groovy是Java生态系统中的重要组成部分,它们在现代软件开发中扮演着至关重要的角色。这篇详细的知识点解析将深入探讨这些技术及其相互关系。 1. **SpringBoot**: SpringBoot是...
Maven和Gradle是目前最为流行的两种构建工具,它们各自有着独特的优点和适用场景。本篇将深入探讨Maven与Gradle的差异,并分享一些Java开发的经验技巧。 Maven是Apache软件基金会的一个开源项目,它通过一个统一的...
Gradle Maven出版物 Gradle脚本/插件,可使用gradle maven或maven-publish插件帮助发布jar / aar工件。 该存储库包含两个组件:脚本和插件: 这些脚本的工作方式与但同时支持maven和maven-publish以及pom.xml更多...
Maven 到 Gradle 将 Maven 依赖项转换为 Gradle 的非常基本的网页。 目前只解析 groupId、artifactId 和 version。 范围被忽略。 如果使用版本变量,它将保留它,但您仍然需要在 build.gradle 文件中定义该变量 ...
Maven和Gradle就是其中的两大巨头,深受Java开发者喜爱。本压缩包包含"Maven权威指南"和"Gradle实战"两本书籍,旨在帮助读者深入理解和掌握这两款强大的构建工具。 首先,让我们来看看Maven。Maven是由Apache ...
总的来说,`gradle-2.2.3.jar`和`gradle-2.2.3.pom`文件是Android Studio配置Gradle插件不可或缺的部分,它们分别提供了Gradle插件的执行逻辑和依赖管理信息。理解这些文件以及如何配置和使用Gradle,对于高效地进行...
Gradle和Maven是两种广泛使用的构建工具,它们都提供了便捷的方式来下载并管理项目所需的外部库,如jar包。本篇文章将详细探讨如何使用Gradle下载jar包,以及它与Maven在处理依赖上的相似之处。 首先,让我们了解...
Gradle 是一个强大的构建自动化工具,广泛用于Java、Android和其他编程语言的项目。它提供了灵活的构建脚本,支持多种语言和平台,并且允许开发者自定义构建过程。当我们谈论"gradle多可用版本",这通常涉及到在开发...
在构建和管理Java项目时,Gradle和Maven是目前最流行的两个构建工具。Gradle是一种基于Groovy语言的自动化构建工具,而Maven则是基于XML的项目管理和构建自动化工具。虽然两者在使用上有区别,但它们都可以通过配置...
gradle-maven-publish-plugin Gradle插件创建了uploadArchives任务,以自动将所有Java,Kotlin或Android库上传到任何Maven实例。 该插件基于并已得到增强,以添加Kotlin支持并紧跟最新变化。建立module/build.gradle...
Maven和Gradle是两种在Java开发中广泛使用的构建工具,它们极大地简化了项目的构建、依赖管理和部署过程。这里我们将深入探讨这两个工具的核心概念、特点以及它们之间的差异。 **Maven** Maven是由Apache软件基金...
标题中的“springboot整合rabbitMq和多数据源动态切换和跨域访问和gradle加maven和shiro安全框架和lombok自动getset生成”表明这是一个关于Spring Boot集成多个技术的项目。以下是对这些技术及其整合的详细解释: 1...