Gradle vs.Maven

Gradle vs. Maven

Gradle是Stackify的《综合Java开发人员指南》中提供的几种Java开发工具之一,但它不是唯一要考虑的构建自动化工具。 Maven是较旧且常用的替代方法,但是哪种构建系统最适合您的项目? 使用其他工具(例如Spring),允许开发人员在两个系统之间进行选择,以及对这两个系统越来越多的集成,决定权在很大程度上取决于您。

项目的大小,自定义的需求以及其他一些变量可以帮助您选择。 让我们来看看。

摇篮

Gradle是一个完全自动化的构建自动化系统,它使用您在Apache Maven和Apache Ant上看到的概念。 它使用基于编程语言Groovy的领域特定语言,这与Apache Maven有所区别,后者使用XML进行项目配置。 它还使用有向无环图来确定任务的运行顺序。

几位开发人员创建了Gradle,并于2007年首次发布,并于2013年被Google用作Android项目的构建系统。 它旨在支持预计将非常庞大的多项目构建。 它也允许以增量方式添加到构建中,因为它知道项目的哪些部分已更新。 依赖于更新零件的任务将不再执行。 目前,最新的稳定版本是2017年2月发布的3.4版。它支持使用Java,Scala和Groovy进行开发和后续部署,并在将来引入其他项目工作流和语言。

马文
<铅>

Maven用于使用Java进行项目构建自动化。 它可以帮助您确定特定软件的构建方式以及其不同的依存关系。 它使用XML文件来描述您正在构建的项目,与第三方模块和部件有关的软件依赖性,构建顺序以及所需的插件。 有诸如打包和编译之类的任务的预定义目标。

Maven将从不同的存储库下载库和插件,然后将它们全部放入本地计算机的缓存中。 虽然主要用于Java项目,但是您可以将其用于Scala,Ruby和C#,以及许多其他语言。

Gradle vs.Maven

两种系统方法的构建方式存在一些根本差异。 Gradle基于任务依赖关系图-其中任务就是工作,而Maven基于固定和线性的阶段模型。 使用Maven,目标将附加到项目阶段,目标的作用类似于Gradle的任务,即"完成工作的事物"。

在性能方面,两者都允许多模块构建并行运行。 但是,Gradle允许增量构建,因为它检查是否更新了哪些任务。 如果是这样,则不执行任务,从而使您的构建时间大大缩短。 您可以在Gradle上找到的其他出色的性能功能包括:

  • Java类的增量编译

  • Java的编译避免

  • 对增量子任务使用API

  • 编译器守护程序还可以使编译速度更快

  • 在管理依赖项时,Gradle和Maven都可以处理动态和传递性依赖项,以使用第三方依赖项缓存并读取POM元数据格式。 您还可以通过中央版本控制定义声明库版本并强制执行中央版本控制。 两者都从其工件存储库下载可传递依赖项。 Maven具有Maven Central,而Gradle具有JCenter,您也可以定义自己的私人公司存储库。 如果需要多个依赖项,Maven可以同时下载这些依赖项。

    但是,Gradle在涉及API和实现依赖项以及固有地允许并发安全高速缓存方面取胜。 它还将存储库元数据与缓存的依赖项保持在一起,确保使用同一缓存的两个或多个项目不会相互覆盖,并且具有基于校验和的缓存,并且可以将缓存与存储库同步。 此外,Gradle与IVY元数据兼容,允许您定义自定义规则以为动态依赖项指定版本,并解决版本冲突。 这些在Maven上不可用。

    您只能在Gradle上找到的其他依赖项管理功能包括:

  • 对兼容库使用替换规则

  • 使用ReplacedBy规则

  • 更好的元数据解析

  • 动态地用外部依赖替换项目依赖的能力,反之亦然

  • Gradle还为您提供了使用复合构建的轻松时间,它使您可以使用临时和永久复合构建,以及组合不同的构建并将复合构建导入到IntelliJ IDEA的Eclipse中。

    就执行模型而言,两者都有任务组和描述。 两者都使您只能构建指定的项目及其依赖项。 但是,Gradle具有完全可配置的DAG,而对于Maven,一个目标只能附加到另一个目标。 多个目标采用有序列表的形式。 Gradle还允许任务排除,传递排除和任务依赖推断。 Gradle还具有任务排序和完成器等高级功能。

    管理构建基础结构是Gradle的另一个优势,因为它使用接受自动预配置的包装器,而使用Maven,您需要扩展以支持自我配置构建。 Gradle还使您能够配置基于版本的构建环境,而无需手动设置它们。 它还允许自定义分发。

    程式码范例

    在对Ant,Gradle和Maven进行比较时,Naresh Joshi在Programming Mitra上比较了创建构建脚本所需的代码,该构建脚本进行编译,执行静态分析,运行单元测试并创建JAR文件。

    这是使用Maven实现此目标所需的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <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.programming.mitra</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>
        </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目标,您将执行以下操作:

    1
    mvn package

    请注意,使用此代码,您在设置参数但未指定必须执行的任务。 您可以添加插件(例如Maven CheckStyle,FindBugs和PMD)以将静态分析与单元测试一起作为单个目标执行,但是您需要指定海关检查样式配置的路径以确保其在出错时失败 ,使用以下代码:

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <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>

    要实现该目标,请执行以下操作:

    1
    mvn verify

    它需要大量的XML代码来完成一些基本和常见的任务,因此,在Maven中具有大量任务和依赖项的项目可能会导致pom.xml文件包含数百到数千行代码。

    进行比较,下面是一个build.gradle代码示例,该代码实现了类似的结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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'
    }

    该代码较短,并且还引入了一些上面的Maven代码未涵盖的有用任务。 对Gradle可以使用当前配置运行的任务列表执行以下命令:

    1
    gradle tasks --all

    如何选择

    总体而言,这两种工具各有优缺点。

  • 定制的内部版本。使用Maven,您可以轻松定义项目的元数据和依赖项,但是创建高度定制的内部版本可能是Maven用户的噩梦。随着项目的发展,POM文件很容易膨胀,并且以后可能会成为无法读取的XML文件。

  • 依赖关系管理和目录结构。尽管如此,Maven提供了简单而有效的依赖关系管理,并且由于它具有适用于您项目的目录结构,因此所有项目都具有某种标准布局。它为其POM文件使用一个声明性XML文件,并具有许多可以使用的插件。 Gradle使用您在Maven上看到的目录结构,但是可以自定义。它还使用了与Maven用来识别工件的GAV格式相同的格式。

  • 插件和集成。 Maven还支持各种构建生命周期步骤,并与第三方工具(例如CI服务器,代码覆盖插件和工件存储库系统)无缝集成。就插件而言,现在有越来越多的可用插件,并且有大型厂商具有与Gradle兼容的插件。但是,与Gradle相比,Maven仍然有更多可用的插件。

  • 灵活性。另一方面,Gradle非常灵活,并且基于脚本。自定义构建很容易在Gradle上完成。但是,由于Gradle实际上是一个新手,因此了解Gradle由内而外的开发人员的数量可能会受到限制。

  • 最后,您选择的内容将主要取决于您的需求。 Gradle功能更强大。 但是,有时您确实不需要它提供的大多数功能。 Maven可能是小型项目的最佳选择,而Gradle则是大型项目的最佳选择。 如果您一直在使用Maven,但发现您的项目已经超出了它的范围,则可以从Maven迁移到Gradle。

    有关Gradle和Maven的其他资源和教程

    有关更多阅读和更多信息(包括有用的教程),请访问以下资源:

  • Gradle构建系统-教程

  • Gradle入门

  • 5分钟内完成Maven

  • 用于构建Java应用程序的Maven –教程

  • Maven教程