本人博客文章网址:https://www.peretang.com/basic-knowledge-of-maven/
Maven简介
Maven , 用于Java项目的构建 , 依赖管理 , 项目信息管理的项目管理工具.
是Apache组织旗下的开源项目.
Maven核心功能是一个具有跨平台特性的构建工具 , 帮助我们自动化构建 , 并提供一个完整的优化的构建生命周期模型 , 和构建任务所需的基础组件/插件.
Maven还是一个依赖管理工具和项目信息管理工具 , 方便开发人员更好的管理依赖与避免项目信息混乱等问题.
Maven还提供了一套标准的约定规则 , 减轻不同项目的差异性.
Maven特性
Maven标准约定规则
Maven是一个约定优于配置的工具 , 只要遵守Maven的约定 , 那么只需要少量的配置 ,Maven就能帮助你完成你所需的大部分工作
Maven构建
Maven统一了项目构建时的阶段 , 提供了一个标准化的构建阶段模型:
1. validate (验证) : 验证项目的所有必要信息的正确性
2. initialize (初始化) : 初始化构建状态 , 例如设置属性或创建目录
3. generate-sources,process-sources (处理源文件) : 处理项目源文件
4. generate-resources,process-resources (处理资源文件) : 对资源文件进行处理 , 并将其复制到目标目录 , 等待打包
5. compile,process-classes (主代码编译) : 编译项目的主代码至目标文件夹
6. generate-test-sources,process-test-sources (处理测试源文件) : 对项目测试源文件进行处理
7. generate-test-resources,process-test-resources (处理测试资源文件) : 对项目测试资源文件进行处理 , 并将其复制到目标目录
8. test-compile,process-test-classes (测试代码编译) : 编译项目的测试源代码至目标文件夹
9. test (测试) : 使用项目定义的单元测试框架进行测试
10. prepare-package,package (打包) : 将编译后的主代码打包成所需的格式"软件包"
11. pre-integration-test,integration-test,post-integration-test (集成测试) : 如需要 , 会将打包好的"软件包"部署到可以运行集成测试的环境中进行集成测试
12. verify (校验) : 运行定义的检查步骤以验证"软件包"是否有效 或 是否符合质量标准
13. install (安装) : 将"软件包"安装到本地仓库[1]中 , 以作为本地其他项目的依赖
14. deploy (部署) : 将"软件包"发布到远程仓库[2]中 , 以供其他人使用与项目共享
Maven依赖管理与项目信息管理
关于依赖管理方面 , 在目前这个年代 , 几乎每个Java应用都会有第三方的开源库依赖 , 若还是使用手工的方式管理会严重影响开发人员的效率 , 并会因为依赖增多的问题的增加更加复杂 , 所幸Maven提供了优秀的解决方案 , 通过引入"GroupId","ArtifactId","Version","type"等元素为Java的依赖问题提供了一个坐标系统 , 从而帮助开发人员更好的管理项目.
关于项目信息管理方面 , 当开发人员使用第三方开源库时 , 总会有需要查看文档 , 源代码等需求 , 在使用Maven之前 , 开发人员总需要去各大搜索引擎去查找这些信息 , 但当引入Maven后 , 这些关于项目的信息 , 可以统一在POM文件[3]中声明 , 方便其他人的查找 , 与项目信息的统一管理.
POM文件
POM文件是Maven的一大核心内容 , 其全称为"Project Object Model"即项目对象模型.
其用于定义项目的基本信息 , 指定项目如何构建 , 声明项目依赖 ; POM文件提现了Maven的一大优点 , 即能让项目对象模型最大程度与项目代码等相独立 , 即把两者的关系进行了解耦.
Maven坐标系统
Maven构件 : 指的是平时项目打包完成后的的一些jar , war等文件.
Maven坐标为各种构件引入了秩序 , 任何一个构件都必须明确定义自己的唯一坐标 ; 而一组Maven坐标就是通过以下一组元素定义的 :
groupId : 定义当前Maven项目隶属的实际项目
artifactId : 定义实际项目中的一个Maven模块/项目 , 推荐使用groupId作为artifactId的前缀
version : 定义Maven模块/项目所处的版本 , Maven定义了一套完整的版本规范
packaging : 定义Maven模块/项目的打包方式
classifier : 帮助定义一些与主构件对应的附属构件
Maven仓库就是基于Maven的坐标系统
Maven仓库
得益于Maven的坐标机制 , 任何Maven项目使用的任何一个"构件"的方式都是相同的 ; 在此基础上 , Maven可以在某个位置统一储存所有Maven项目共享的"构件" , 这就是仓库 ; 因为仓库 , 所以Maven项目不再需要各自储存依赖的"构件" , 转而只需声明这些依赖的坐标 , 在需要的时候 , Maven会自动根据坐标找到仓库中的"构件" , 并使用它们.
仓库的分类有两种 , 本地仓库与远程仓库 ; 当Maven根据坐标寻找"构件"的时候 , Maven会先查看本地仓库 , 如果本地仓库存在此构件 , 则直接使用 ; 如果本地仓库不存在此"构件" , 或需要查看是否有更新的版本 , Maven就会去远程仓库查找 , 当发现所需的"构件"后 , 就会下载到本地仓库后再使用 ; 如果最终本地仓库与远程仓库都无法找到所需要的"构件"时 , Maven就会报错.
参考