喔,填坑呢在这
组成
- 坐标
- groupId 隶属组织名称
- artifactId 当前项目名称
- version 当前版本号
- packaging 打包方式(默认为jar)
- 作用:唯一定位该资源,查找、下载并使用资源
配置
- 环境变量MAVEN_HOME
- 可以配置settings.xml(全局生效),也可以配置pom.xml(对当前项目生效)
- 本地仓库配置
… - 配置镜像仓库(加速下载,常用阿里云仓库)
…
依赖
- 项目可以依赖项目
- 项目可以依赖现成的包
- 依赖中存在的问题:
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
- 可选依赖
- 场景:不希望别人知道我用过这个依赖
- 效果:当前项目使用该依赖,但依赖该项目的项目不自动引用该依赖
- 排除依赖
- 场景:不希望使用某依赖
- 在一个dependency里写:
1
2
3
4
5
6<exclusions>
<exclusion>
<groupId></groupid>
<artifactId></artifactId>
</exclusion>
</exclusions> - 效果:若当前项目排除了依赖项目的A依赖,则该A依赖不会被当前应用所依赖
- 依赖范围:
注意:依赖范围具有传递性1
<scope></scope>
scope 主代码 测试代码 打包 compile(默认) 1 1 1 test 0 1 0 provided 1 1 0 runtime 0 0 1
生命周期与插件
clean 清理
pre-clean
clean
post-clean
default 核心工作(编译、测试、打包、部署)
site 产生报告
pre-
site
post-site
site-deploy
插件:与生命周期相绑定
或者可以说maven的每一个生命周期都是利用插件来实现的
- 引入
引入方式同依赖,只不过把dependency改成plubins/plugin
<groupId>…</groupId>
<artifactId>….</artifactId>
<version>…</version> - 目标
设置<executions>…</executions>
下层:指令</goal> 运行阶段</phase>
即为在哪个生命周期中执行该插件
分模块开发与设计
总目标:将程序拆装成不同模块,利用接口通信 (不是java的接口)
controller 控制层
service 业务层
dao 持久层
pojo 展示层
聚合依赖
用一个模块来管理其他模块
- 设置聚合模块打包方式为pom
- <modules>被聚合的工程列表</modules>
继承
- 模块依赖关系维护
子模块可以声明需要依赖,但是不限定版本,若出现版本冲突则会难以解决
解决方案:- 在聚合模块中声明所有的依赖
- 在子模块中声明<parent>工件ID/版本/GroupId….</parent>
- 子工程在设计dependency时不需要写version
继承的作用:子工程中沿用父工程的依赖配置
属性
定义自定义属性
1 | <properties> |
版本管理
- 关于版本号命名的小常识
- snapshot 开发过程中,为方便合作或解决依赖等,输出的临时性版本,会随着开发的进展不断更新,更新周期较短
- release 经过测试后,团队对外发布的,运行较为稳定的版本,更新周期较长
- 关于版本号的一些约定:<主版本><次版本><增量版本><里程碑版本>
- 如:5.1.13-Release
多环境开发配置-不需逐个更改文件即可兼容(生产环境/开发环境/测试环境……)
1 | <profiles> |
执行特定环境方法:mvn
跳过测试
- 常用场景:
- 模块功能未开发(完毕)
- 单个功能更新导致其他功能失效
- 快速打包
- 方式
- 在maven配置窗口跳过
- mvn
-D skipTests - 在pom中配置测试插件(maven-surefire-plugin),设置<skipTests>true</skipTests>(不建议使用)
- 只使用部分用例测试
- 在测试插件(maven-surefire-plugin)的configuration中,设置include-对应的测试用例(.java)