首先谈谈为什么要学习Maven?
依赖管理
大家还记得在学习JavaWeb时需要向web项目中引入少许jar包嘛?还记得引入jar包的繁琐过程嘛?实际项目中可能光基座需要引入的jar包就成千上万,jar包从哪里获取也是一个问题。项目中的jar包不仅数量庞大,彼此之间存在着错综复杂的依赖关系,如果程序员需要手动梳理是需要极大的学习成本,且这些工作对实现业务功能毫无帮务。开发人员应该将精力集中投入于业务上,不应该投入大量的时间在依赖管理上。
构建管理
项目的构建,简单解释一下就是将项目编译且打包,用于部署。当我们在通过Idea启动项目时,这些工作都是由Idea工具帮我们无感知的实现了,但实际开发中项目是要上环境的,脱离IDE环境如何实现呢~
此时实际开发中构建过程如下图所示,开发人员大多数只操作以下三步即可
- 开发人员在本地环境完成编码工作且自测通过
- 提交代码于远程仓库(通常是企业部署的gitlab)
- CI/CD控制面板上选择分支部署项目(常用的如Jenkins、TeamCity、云效等)
简而言之,需要专门的工具去做依赖管理和构建管理。
什么是Maven?
Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。
这里在详细的解释一下两个关键词:
构建
比如说去便利店买一杯冰美式,顾客只需要知道购买哪个产品,并不知晓产品的构建过程。构建就是将原材料整合一起制作成产品的过程。
Java项目构建过程包含的主要的环节如下
-
清理:删除上一次构建的结果,为下一次构建做好准备
-
编译:Java 源程序编译成 *.class 字节码文件
-
测试:运行提前准备好的测试程序
-
报告:针对刚才测试的结果生成一个全面的信息
-
打包(jar包、war包)
-
安装:把一个 Maven 工程经过打包操作生成的 jar 包或 war 包存入 Maven 仓库
-
部署
-
部署 jar 包:把一个 jar 包部署到 Nexus 私服服务器上
-
部署 war 包:借助相关 Maven 插件(例如 cargo),将 war 包部署到 Tomcat 服务器上
-
依赖
如果 A 工程里面用到了 B 工程的类、接口、配置文件等等这样的资源,那么我们就可以说 A 依赖 B。
例如:在当前项目上开发一个有关Excel导入导出的功能,阿里开源了EasyExcel这个工具项目包(当然大佬的你可以选择自己编码实现,但老板着急要),当前项目引入EasyExcel工具包快速实现导入导出的业务功能。此时当前项目依赖于EasyExcel工具。
依赖管理中要解决的具体问题:
- jar 包的下载:使用 Maven 之后,jar 包会从规范的远程仓库下载到本地
- jar 包之间的依赖:通过依赖的传递性自动完成
- jar 包之间的冲突:通过对依赖的配置进行调整,让某些jar包不会被导入
Maven的工作机制Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。
这里在详细的解释一下两个关键词:
构建
比如说去便利店买一杯冰美式,顾客只需要知道购买哪个产品,并不知晓产品的构建过程。构建就是将原材料整合一起制作成产品的过程。
Java项目构建过程包含的主要的环节如下
-
清理:删除上一次构建的结果,为下一次构建做好准备
-
编译:Java 源程序编译成 *.class 字节码文件
-
测试:运行提前准备好的测试程序
-
报告:针对刚才测试的结果生成一个全面的信息
-
打包(jar包、war包)
-
安装:把一个 Maven 工程经过打包操作生成的 jar 包或 war 包存入 Maven 仓库
-
部署
-
部署 jar 包:把一个 jar 包部署到 Nexus 私服服务器上
-
部署 war 包:借助相关 Maven 插件(例如 cargo),将 war 包部署到 Tomcat 服务器上
-
依赖
如果 A 工程里面用到了 B 工程的类、接口、配置文件等等这样的资源,那么我们就可以说 A 依赖 B。
例如:在当前项目上开发一个有关Excel导入导出的功能,阿里开源了EasyExcel这个工具项目包(当然大佬的你可以选择自己编码实现,但老板着急要),当前项目引入EasyExcel工具包快速实现导入导出的业务功能。此时当前项目依赖于EasyExcel工具。
依赖管理中要解决的具体问题:
- jar 包的下载:使用 Maven 之后,jar 包会从规范的远程仓库下载到本地
- jar 包之间的依赖:通过依赖的传递性自动完成
- jar 包之间的冲突:通过对依赖的配置进行调整,让某些jar包不会被导入
Maven的工作机制
Maven 和 Gradle 的区别?
Java世界中主要有三大构建工具:Ant、Maven和Gradle。经过几年的发展,Ant几乎销声匿迹、Maven是用的普遍的一种,而Gradle目前也越来越受追捧。Maven与Gradle在使用中各有千秋,根据使用场景择优用之。
Maven:
- 稳定可靠,插件众多。(这么多年版本一直维持在3.XX,而且很久才发布一次小更新,说明他稳定且bug较少;
- 配置略显啰嗦,自定义逻辑较麻烦(Maven使用xml的方式进行配置,xml的劣势繁琐就会体现在Maven上);
- 性能问题,使用Maven构建的项目都会经过几个生命流程,内部没有缓存机制,项目越来越大重新构建所花费的时间也就越长;
- 由于Maven的开发基本靠社区支持,没有更多的资金用于继续开发维护Maven,导致开发基本停泻。
Gradle:
- Gradle采用代码逻辑的方式进行构建,使得它能更加的灵活。
- Gradle内部存在缓存机制(当文件输入和输出都没改变的情况下,认为这就是没变的代码,直接进行输出。但当你改变的依赖包版本,它有时并没更新,也是缓存机制的问题),相比会快些。
- 开发活跃,版本太多
初级开发的咱们当然是公司指定用啥咱们就用啥啦,适当的了解也会起到一定的帮助~