maven_Java构建工具:Ant vs. Maven vs Gradle

maven

maven

最初,Make是唯一可用的构建工具。 后来用GNU Make进行了改进。 但是,从那时起,我们的需求增加了,结果,构建工具也不断发展。

JVM生态系统主要由三个构建工具组成:

蚂蚁
Ant是“现代”构建工具中的第一个。 在许多方面,它类似于Make。 它于2000年发布,并在短时间内成为Java项目最受欢迎的构建工具。 它的学习曲线非常低,因此任何人都可以在无需任何特殊准备的情况下开始使用它。 它基于过程编程思想。

最初发行后,它通过接受插件的功能得到了改进。

主要缺点是将XML作为编写构建脚本的格式。 XML本质上是分层的,因此不适合Ant使用的过程编程方法。 Ant的另一个问题是,与非常小的项目一起使用时,其XML往往变得难以管理。

后来,由于必须通过网络进行依赖管理,Ant采用了Apache Ivy

Ant的主要好处是对构建过程的控制。

专家
Maven于2004年发布。其目标是改善开发人员在使用Ant时面临的一些问题。

Maven继续使用XML作为编写构建规范的格式。 但是,结构截然不同。 尽管Ant要求开发人员编写所有导致成功执行某些任务的命令,但Maven依赖于约定并提供了可以调用的可用目标(目标)。 作为附加的(可能也是最重要的附加功能),Maven引入了通过网络下载依赖项的功能(后来由Ant通过Ivy采用)。 这本身就彻底改变了我们交付软件的方式。

但是,Maven有其自身的问题。 依赖关系管理不能很好地处理同一库的不同版本之间的冲突(Ivy更擅长于此)。 XML作为构建配置格式经过严格的结构化和高度标准化。 目标(目标)的定制很难。 由于Maven主要关注于依赖关系管理,因此,与在Ant中相比,在Maven中编写复杂,自定义的构建脚本实际上更加困难。

用XML编写的Maven配置连续又繁琐。 在较大的项目中,它可以具有数百行代码,而无需实际执行“非凡”的工作。

Maven的主要好处是其生命周期。 只要该项目基于某些标准,就可以使用Maven相对轻松地贯穿整个生命周期。 这是以灵活性为代价的。

同时,对DSL(特定领域语言)的兴趣持续增长。 想法是设计用于解决属于特定领域的问题的语言。 在构建的情况下,应用DSL的结果之一就是Gradle。

摇动
Gradle结合了这两种工具的优点,并在它们之上进行了DSL和其他改进。 它具有Ant的功能和灵活性,并具有Maven的生命周期和易用性。 最终结果是该工具于2012年发布,并在短时间内引起了广泛关注。 例如,谷歌采用Gradle作为Android OS的默认构建工具。

Gradle不使用XML。 相反,它具有基于Groovy (一种JVM语言)的DSL。 结果,Gradle构建脚本往往比为Ant或Maven编写的脚本更短,更清晰。 Gradle的样板代码量要少得多,因为它的DSL是为解决特定问题而设计的:在软件的整个生命周期中移动软件,从编译到静态分析和测试,再到打包和部署。

它正在将Apache Ivy用于JAR依赖项。

摇摇晃晃的工作可以总结为“聚会好,灵活性好”。

代码示例

我们将创建构建脚本,这些脚本将进行编译,执行静态分析,运行单元测试以及最终创建JAR文件。 我们将在所有三个框架(Ant,Maven和Gradle)中进行这些操作,并比较语法。 通过比较每个任务的代码,我们将能够更好地理解差异并就构建工具的选择做出明智的决定。

首先是第一件事。 如果您要自己完成本文中的示例,则需要安装AntIvyMavenGradle 。 请遵循这些工具制造商提供的安装说明。 您可以选择不自己运行示例,而完全跳过安装。 代码段应该足以让您了解每种工具的工作原理。

代码存储库https://github.com/vfarcic/JavaBuildTools包含Java代码(两个带有相应测试的简单类),checkstyle配置以及Ant,Ivy,Maven和Gradle配置文件。

让我们从Ant和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>

首先,我们指定几个属性。 从那里开始是一项接一个任务。 我们使用Ivy来解决依赖关系,清理,编译并最终创建JAR文件。 几乎每个Java项目都需要执行的任务需要大量的配置。

要运行创建JAR文件的Ant任务,请执行以下操作。

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.0

http://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>

要运行创建JAR文件的Maven目标,请执行以下操作。

mvn package

主要的区别在于,使用Maven,我们不需要指定应该做什么。 我们不是在创建任务,而是在设置参数(依赖项是什么,要使用哪些插件……)。 这显示了Ant和Maven之间的主要区别。 后来提倡使用约定,并提供现成的目标(目标)。 随着时间的流逝,Ant和Maven XML文件都会变得越来越大。 为了说明这一点,我们将添加Maven CheckStyle,FindBugs和PMD插件,这些插件将负责静态分析。 这三个都是相当标准的工具,在许多Java项目中都以一种或另一种形式使用。 我们希望作为一个单一的目标的一部分一起验证与单元测试来执行所有的静态分析。 此外,我们应指定自定义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>

要运行使用CheckStyle,FindBugs和PMD运行单元测试和静态分析的Maven目标,请执行以下操作。

mvn verify

我们必须编写许多XML,这些XML可以完成一些非常基本且常用的任务集。 在具有更多依赖项和任务的真实项目中,Maven pom.xml文件可以轻松访问数百甚至数千行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短得多,而且对于熟悉Gradle的人来说比Maven更易于理解,而且实际上引入了许多有用的任务,而这些正是我们刚刚编写的Maven代码所没有的。 要获取Gradle可以使用当前配置运行的所有任务的列表,请执行以下操作。

gradle tasks --all

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

对于新手来说,Ant是所有工具中最清晰的工具。 只需阅读配置XML,就可以了解它的作用。 但是,编写Ant任务很容易变得非常复杂。 Maven,特别是Gradle,具有许多现成可用的或通过插件提供的任务。 例如,通过看下面的一行,对于那些尚未进入Gradle之谜的人来说,可能不清楚他们将解锁哪些任务供我们使用。

[build.gradle]
apply plugin: 'java'

这行简单的代码添加了20多个任务,等待我们使用。

在我看来,Ant的可读性和Maven的简单性是错误的论点,它们仅在短暂的最初Gradle学习曲线期间适用。 一旦使用了Gradle DSL,它的语法就会比Ant或Maven所采用的语法更短,更容易理解。 而且,只有Gradle提供约定和命令创建。 尽管可以用Ant任务扩展Maven,但它很繁琐且效率不高。 Groovy的Gradle将其提升到一个新的水平。

下一篇文章将更深入地介绍Gradle,并更详细地说明其与Groovy的集成。

翻译自: https://www.javacodegeeks.com/2014/06/java-build-tools-ant-vs-maven-vs-gradle.html

maven

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值