创世之初,世上只有Make一种构建工具,后来,其发展为GNU Make。但是,由于需求的不断涌现,码农的世界里逐渐演化出了千奇百怪的构建工具。
当前,JVM生态圈由三大构建工具所统治:

  • Apache Ant带着Ivy
  • Maven
  • Gradel

Ant with Ivy

Ant是第一个“现代”构建工具,在很多方面它有些像Make。2000年发布,在很短时间内成为Java项目上最流行的构建工具。它的学习曲线很缓,因此不需要什么特殊的准备就能上手。它基于过程式编程的idea。在最初的版本之后,逐渐具备了支持插件的功能。
主要的不足是用XML作为脚本编写格式。 XML,本质上是层次化的,并不能很好地贴合Ant过程化编程的初衷。Ant的另外一个问题是,除非是很小的项目,否则它的XML文件很快就大得无法管理。
后来,随着通过网络进行依赖管理成为必备功能,Ant采用了Apache Ivy。

Ant的主要优点在于对构建过程的控制上。

Maven

Maven发布于2004年。目的是解决码农使用Ant所带来的一些问题。
Maven仍旧使用XML作为编写构建配置的文件格式,但是,文件结构却有巨大的变化。Ant需要码农将执行task所需的全部命令都一一列出,然而Maven依靠约定(convention)并提供现成的可调用的目标(goal)。不仅如此,有可能最重要的一个补充是,Maven具备从网络上自动下载依赖的能力(Ant后来通过Ivy也具备了这个功能),这一点革命性地改变了我们开发软件的方式。
但是,Maven也有它的问题。依赖管理不能很好地处理相同库文件不同版本之间的冲突(Ivy在这方面更好一些)。XML作为配置文件的格式有严格的结构层次和标准,定制化目标(goal)很困难。因为Maven主要聚焦于依赖管理,实际上用Maven很难写出复杂、定制化的构建脚本,甚至不如Ant。
用XML写的配置文件会变得越来越大,越来越笨重。在大型项目中,它经常什么“特别的”事还没干就有几百行代码。
Maven的主要优点是生命周期。只要项目基于一定之规,它的整个生命周期都能够轻松搞定,代价是牺牲了灵活性。

在对DSL(Domain Specific Languages)的热情持续高涨之时,通常的想法是设计一套能够解决特定领域问题的语言。在构建这方面,DSL的一个成功案例就是Gradle。

Gradle

Gradle结合了前两者的优点,在此基础之上做了很多改进。它具有Ant的强大和灵活,又有Maven的生命周期管理且易于使用。最终结果就是一个工具在2012年华丽诞生并且很快地获得了广泛关注。例如,Google采用Gradle作为Android OS的默认构建工具。
Gradle不用XML,它使用基于Groovy的专门的DSL,从而使Gradle构建脚本变得比用Ant和Maven写的要简洁清晰。Gradle样板文件的代码很少,这是因为它的DSL被设计用于解决特定的问题:贯穿软件的生命周期,从编译,到静态检查,到测试,直到打包和部署。
它使用Apache Ivy来处理Jar包的依赖。
Gradle的成就可以概括为:约定好,灵活性也高。

代码示例

我们写一段构建脚本来完成从编译、静态检查、单元测试到最终打Jar包的过程。我们分别使用三个框架(Ant,Maven和Gradle)来完成这件事情,比较一下语法。通过比较每一个任务的代码,我们能够对差异有一个更好的理解,并对选择构建工具做出一个周全的决策。
事有先后,如果你自己按照本文来学习样例,需要安装Ant,Ivy,Maven和Gradle,请根据相应工具的安装指导进行操作。你也可以不用自己跑样例,也统统不用安装,代码片段应该足够让你明白这些工具是如何工作的。
代码库 https://github.com/vfarcic/JavaBuildTools包含有Java代码(两个简单的类和测试代码),checkstyle配置文件和Ant,Ivy,Maven以及Gradle的配置文件。
先从Ant带着Ivy开始

Any带着Ivy

Ivy的依赖需要在ivy.xml中指定。我们的例子很简单,只需要依赖JUnit和Hamcrest。

ivy.xml

<ivy-module version="2.0"><info organisation="org.apache" module="java-build-tools"/><dependencies><dependency org="junit" name="junit" rev="4.11"/><dependency org="org.hamcrest" name="hamcrest-all" rev="1.3"/></dependencies>
</ivy-module>

现在我们来创建Ant脚本,任务只是编译一个Jar文件。最终文件是下面的build.xml。

build.xml

<project xmlns:ivy="antlib:org.apache.ivy.ant" name="java-build-tools" default="jar"><property name="src.dir" value="src"/><property name="build.dir" value="build"/><property name="classes.dir" value="${build.dir}/classes"/><property name="jar.dir" value="${build.dir}/jar"/><property name="lib.dir" value="lib" /><path id="lib.path.id"><fileset dir="${lib.dir}" /></path><target name="resolve"><ivy:retrieve /></target><target name="clean"><delete dir="${build.dir}"/></target><target name="compile" depends="resolve"><mkdir dir="${classes.dir}"/><javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="lib.path.id"/></target><target name="jar" depends="compile"><mkdir dir="${jar.dir}"/><jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}"/></target></project>

首先,我们设置了几个属性,然后是一个接一个的task。我们用Ivy来处理依赖,清理,编译和打包,这是几乎所有的Java项目都会进行的task,配置有很多。
运行Ant task来生成Jar文件,执行下面的命令。

ant jar

我们来看Maven如何完成同样的工作。

Maven

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.technologyconversations</groupId><artifactId>java-build-tools</artifactId><packaging>jar</packaging><version>1.0</version><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-all</artifactId><version>1.3</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version></plugin></plugins></build></project>

通过执行下面的命令来运行Maven goal生成Jar文件。

mvn package

主要的区别在于Maven不需要指定执行的操作。我们没有创建task,而是设置了一些参数(有哪些依赖,用哪些插件...). Maven推行使用约定并提供了开箱即用的goals。Ant和Maven的XML文件都会随时间而变大,为了说明这一点,我们加入CheckStyle,FindBugs和PMD插件来进行静态检查,三者是Java项目中使用很普遍的的工具。我们希望将所有静态检查的执行以及单元测试一起作为一个单独的target Verify。当然我们还应该指定自定义的checkstyle配置文件的路径并且确保错误时能够提示。更新后的Maven代码如下:

pom.xml

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-checkstyle-plugin</artifactId><version>2.12.1</version><executions><execution><configuration><configLocation>config/checkstyle/checkstyle.xml</configLocation><consoleOutput>true</consoleOutput><failsOnError>true</failsOnError></configuration><goals><goal>check</goal></goals></execution></executions>
</plugin>
<plugin><groupId>org.codehaus.mojo</groupId><artifactId>findbugs-maven-plugin</artifactId><version>2.5.4</version><executions><execution><goals><goal>check</goal></goals></execution></executions>
</plugin>
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-pmd-plugin</artifactId><version>3.1</version><executions><execution><goals><goal>check</goal></goals></execution></executions>
</plugin>

通过执行下面的命令来运行Maven goal,包括单元测试,静态检查,如CheckStyle,FindBugs和PMD。

mvn verify

我们需要写很多XML来进行基本的常用的任务。在实际项目中有更多的依赖和task,Maven的pom.xml很容易就有成百上千行的配置。

下面看看Gradle如何完成同样的任务。

Gradle

build.gradle

apply plugin: 'java'
apply plugin: 'checkstyle'
apply plugin: 'findbugs'
apply plugin: 'pmd'version = '1.0'repositories {mavenCentral()
}dependencies {testCompile group: 'junit', name: 'junit', version: '4.11'testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3'
}

Gradle不仅代码少了很多,对于熟悉的人来说,比Maven要更容易理解,而且它还包括很多Maven代码没有覆盖的有用的task。请执行下面的命令来得到Gradle在当前配置下能够支持的task列表。

gradle tasks --all

清晰性,复杂度和学习曲线

对于初学者,Ant是最清晰的。只要读懂XML配置文件你就能够理解它干了些什么,但是,Ant文件很容易变复杂。Maven和Gradle,尤其是Gradle,有很多开箱即用的插件。例如,下面这行代码可能会令那些对Gradle一知半解的人有些困惑,不知道通过这句话就能够使用哪些task。
build.gradle

apply plugin: 'java'

简单的这一行增加了20多个可用的任务.
Ant的可读性和Maven的简单性,在我看来,是伪命题,只适用于Gradle学习曲线的初级阶段。一旦用上了Gradle的DSL,就会发现语法比Ant和Maven更加短小精悍、易于理解。不仅如此,只有Gradle既提供了约定也提供了自定义命令。如果说Maven可以通过Ant task来扩展,这似乎有些滑稽可笑,而且低效,Groovy写的Gradle将其提升了一个层次。

原文链接:http://technologyconversations.com/2014/06/18/build-tools/

Java构建工具:Ant vs Maven vs Gradle相关推荐

  1. java+构建+工具+Ant+Maven+Gradle

    java+构建+工具+Ant+Maven+Gradle Ant+Maven+Gradle+............ 目前: Ant已经销声匿迹.Maven也没落了,而Gradle的发展则如日中天. M ...

  2. Java Build工具Ant与Maven之比较

    Java Build工具Ant与Maven之比较 阅读协议:我首先声明本文为翻译文章.译者--我--并不一定认可本文原作者的观点,同时也不保证译者能正确地.清楚地表达出原作者的思想.凡是读者因看了本文 ...

  3. Java Build Tools: Ant vs Maven vs Gradle

    2019独角兽企业重金招聘Python工程师标准>>> Ant with Ivy Ant was the first among "modern" build t ...

  4. Java Build工具Ant与Maven之比较(大谈Maven缺点)

    没有一件东西能满足你的全部想法除非你自己创造一个出来.同样对于Build工具来说,也许最好的就是你自己写的.每个项目的Build过程都是独特的,而且通常你的项目要用多种方式构建.对Build工具的作者 ...

  5. java构建工具 gradle_Java构建工具

    #java构建工具 Ant Ant 是 Apache 组织下的一个跨平台的项目构建工具,它是一个基于任务和依赖的构建系统,是过程式的.开发者需要显示的指定每一个任务,每个任务包含一组由 XML 编码的 ...

  6. Java构建工具:Ant vs. Maven vs Gradle

    最初,Make是唯一可用的构建工具. 后来通过GNU Make进行了改进. 但是,从那时起,我们的需求增加了,结果,构建工具也不断发展. JVM生态系统主要由三个构建工具组成: 常春藤的 Apache ...

  7. aliyun gradle 代理_gradle:现代高效的java构建工具

    相信使用Java的同学都用过Maven,这是一个非常经典好用的项目构建工具.但是如果你经常使用Maven,可能会发现Maven有一些地方用的让人不太舒服: 一来Maven的配置文件是XML格式的,假如 ...

  8. Java构建工具, ZeroC ICE, word2vec

    https://antkillerfarm.github.io/ Java构建工具 构建工具的意义在于,提供一种独立于IDE的软件构建方式.而且通常来说,构建工具更适合特大项目的构建.比如,即使是以功 ...

  9. Java学习之常用的Java构建工具

    常用的Java构建工具介绍: Apache Maven – 主要用于 Java 项目的构建自动化工具. Hudson – 用 Ja​​va 编写的持续集成 (CI) 工具. Jenkins – 一个用 ...

最新文章

  1. hp服务器维护开关,HP服务器开机无显维修案例
  2. html+css+javaScript 写一个简单游戏 看了就会
  3. ADVA收购Overture 扩张NFV产品线
  4. Bzoj1029 [JSOI2007]建筑抢修
  5. Cannot retrieve mapping for action
  6. EasyUI Combobox 设置默认值
  7. linux shell 随机字符生成单词
  8. 定时器函数执行原理揭秘
  9. dlib 人脸特征点检测
  10. 【GlobalMapper精品教程】010:EPSG简介、通过EPSG坐标转换应用实例
  11. 动态表情与超链接制作
  12. Python挑战游戏( PythonChallenge)闯关之路Level- 2
  13. 什么是 COB 灯?
  14. py-eureka-client学习笔记
  15. C C++ 调用第三方DLL库失败 LoadLibrary 返回NULL 并报 126 错误 解决办法
  16. 代码合乱了,git怎么强制覆盖分支?
  17. (翻译)峰终定律(Peak-end rule)
  18. 全角字符数字转换为半角字符数字
  19. 3dmax2016新增加的panorama explorer的使用
  20. 猜字游戏java_Java实现猜字小游戏

热门文章

  1. Pktgen-DPDK使用说明
  2. MongoDB安装Mac M1
  3. Linux系统使用LAMP架构部署Discuz论坛系统,简洁明了
  4. 【音频】音频基础知识
  5. 论文阅读:Aggregated Residual Transformations for Deep Neural Networks
  6. SaaSpace:适合游戏开发者的最佳 3D 建模软件
  7. 2013金山校园招聘Java笔试题
  8. 运营︱如何有效推广海外社交app
  9. cics 服务端配置_使用PHP在CICS上构建RESTful服务
  10. 事务管理之JTA事务