当前位置: 首页 > news >正文

Maven与Gradle的区别_maven和gradle的区别

前言

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依赖解调遵循两个原则,路径最近原则以及定义顺序原则

    Mavenc依赖冲突.png

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

总结:

Maven

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

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

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

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

  • Gradle

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

  • 开发活跃,版本太多

关注公众号:nick_coding1024
同名原创公众号:程序大视界

http://www.jsqmd.com/news/781851/

相关文章:

  • TensorFlow Datasets终极指南:从MNIST到ImageNet的完整数据管道构建
  • 定时执行:按时间自动触发AI任务
  • SCG到ECG信号转换:Wave U-Net模型实现移动端心脏监测
  • XUnity Auto Translator:打破语言壁垒,让Unity游戏畅玩无阻
  • 2026年4月国内有名的黄糊精供应商推荐,型煤球团粘合剂/陶土/氧化铝空心球/磷酸二氢铝/白糊精,黄糊精公司口碑推荐 - 品牌推荐师
  • Dubbo基本原理介绍_dubbo protocol serialization
  • Switch Transformers:稀疏激活MoE模型原理与工程实践指南
  • 掌握LitElement样式系统:从基础CSS到高级主题管理的完整指南
  • XUnity Auto Translator:Unity游戏自动翻译完整指南
  • 虚拟串口终极解决方案:com0com如何彻底改变Windows串口调试工作流
  • 2026年实测降AIGC:论文降AI率收藏攻略,DeepSeek+Claude指令+3款工具,AIGC率99%降至5% - 降AI实验室
  • TensorFlow自动微分终极指南:从基础概念到实战应用的完整教程
  • Windows右键菜单终极优化指南:ContextMenuManager完整使用教程
  • 4I-SIM超分辨显微技术:原理、实现与生物应用
  • WeChatPad:如何让你的手机和平板同时登录同一个微信账号?
  • 基于MCP协议构建Notion加速服务器:架构设计与性能优化实践
  • 2019金三银四已过,送你一篇Java面经_错过了金三银四,找工作5个月,面试15家
  • 3分钟掌握WechatDecrypt:轻松找回你的珍贵微信聊天记录
  • ARM架构内存屏障与同步机制演进解析
  • 如何逆向工程Wallpaper Engine:RePKG深度解析与实战指南
  • 哔哩下载姬Downkyi实战指南:B站视频高效下载与内容管理解决方案
  • Java值传递和引用传递_在java中只有基本类型和按照特定方式初始化的string是按值传递,其他都是按引用传
  • 5分钟快速上手DrQA:开放域问答系统终极入门指南
  • 从零构建高性能静态网站:CSS布局、图像优化与交互设计实战
  • 如何告别百度网盘提取码搜索焦虑?这个开源工具让你3秒直达资源核心
  • 5个神奇功能,让你的英雄联盟游戏体验翻倍提升![特殊字符]
  • * Spring AI 的Tool Calling 工具调用
  • 如何高效管理中文文献:Zotero Jasminum插件的终极解决方案
  • Stratix III FPGA的DPA电路与rx_dpa_locked信号解析
  • 基于MediaPipe与Python的虚拟鼠标:手势识别与坐标映射实战