Maven 与 Gradle 的区别

发布时间 2023-03-25 23:49:16作者: 一品堂.技术学习笔记



Maven 与 Gradle 的区别

 

刘文正_  程序大视界  2020/04/27 20:28  


前言

Java 世界中主要有三大构建工具:Ant、Maven 和 Gradle。经过几年的发展,Ant 几乎销声匿迹、Maven 也日薄西山,而 Gradle 的发展则如日中天。笔者有幸见证了 Maven 的没落和 Gradle 的兴起。Maven 的主要功能主要分为 5 点,分别是依赖管理系统、多模块构建、一致的项目结构、一致的构建模型和插件机制。Maven 与 Gradle 在使用中各有千秋,根据使用场景择优用之。

1. Maven 与 Gradle 对比

maven 要引入依赖 pom.xml

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.1.5.RELEASE</version>
</dependency>

而 Gradle 引入 build.gradle

implementation 'org.springframework.boot:spring-boot-starter-web'

优点: Gradle 相当于 Maven 与 Ant 的合体
缺点:对于微服务多项目的子类引用,不如 Maven

Maven

  • 项目结构 / 依赖由 pom.xml 定义

  • 生产代码存放在 src/main/java 下

  • 测试代码存放在 src/test/java 下

Gradle

  • 项目结构 / 依赖由 build.gradle 定义

  • 生产代码存放在 src/main/java 下

  • 测试代码存放在 src/test/java 下

 

2. 构建流程和生命周期

  • Maven

    • 三个标准的生命周期 (lifecycle)
    • 最小的运行单元是目标 (goal)
    • 插件可以把自己的目标绑定在生命周期的某个阶段 (phase) 上
  • Gradle

    • 没有显示的生命周期
    • 最小的运行单元是任务 (task),任务之间可以相互依赖
    • 可以动态地创建任务



3. 包管理和传递性依赖

  • Maven

    • 一个包由 groupId/artifactId/version 确定唯一坐标
    • 包来源于中央仓库
    • 传递性依赖
      • 当某个包的的使用依赖于其他包时,Maven 会自动导入所有的依赖包
  • Gradle

    • 使用 Ivy 的构件系统,是 Maven 的构件系统的超集

      Ant ivy 是一个比 Maven 仓库更加广阔的仓库

    • 与 Maven 仓库兼容

  • 当出现依赖冲突时

    • Maven 依赖解调遵循两个原则,路径最近原则以及定义顺序原则

    image

    Mavenc 依赖冲突.png

  • Gradle 的冲突解析则是选用新的版本 (新的版本一般都会向下兼容)

总结:

Maven

  • 稳定可靠,插件众多。(这么多年版本一直维持在 3.XX,而且很久才发布一次小更新,说明他稳定且 bug 较少)

  • 略显啰嗦,自定义逻辑较麻烦 (Maven 使用 xml 的方式进行配置,xml 的劣势繁琐就会体现在 Maven 上)

  • 大型项目会逐渐遇到性能问题

    • 使用 Maven 构建的项目都会经过几个生命流程,内部没有缓存机制,项目越来越大重新构建所花费的时间也就越长。
  • 由于 Maven 的开发基本靠社区支持,没有更多的资金用于继续开发维护 Maven,导致开发基本停泻。

  • Gradle

    • Gradle 采用代码逻辑的方式进行构建,使得它能更加的灵活。
  • Gradle 内部存在缓存机制 (当文件输入和输出都没改变的情况下,认为这就是没变的代码,直接进行输出。但当你改变的依赖包版本,它有时并没更新,也是缓存机制的问题),相比会快些。

  • 开发活跃,版本太多