介绍
清理,编译,测试,运行,打包,集成测试,验证,部署整个周期
目录结构
- groupId:(公司反写网址.项目名)【主项目的标识,实际的项目】
- artiFactId:(项目名-模块名)【maven 的项目和我们的实际的项目不一样,maven 是模块化的,一个实际的项目被划分为多个模块。一个模块的标识】
- version:【当前版本号,一般三个数字组成。第一个 0 表示大版本号,第二个 0 表示分支版本号,第三个 0 表示小版本号】
snapshot 快照
alpha 内部测试
beta 公测
Release 稳定
GA 正式发布 - packaging:【maven 项目的打包方式,默认是 jar,还可以其他的 war,zip,pom 等等】
maven 常用的构建命令
mvn -v
mvn compile:编译
mvn test:测试
mvn package:打包
mvn clean :删除 target
mvn install:安装 jar 包到本地仓库,一般是将自己 compile 的 jar 包加入到本地仓库中,也就是如果一个项目用到另一个项目中的文件,我们可以这样使用
自动创建目录骨架
mvn archetype:generate -DgroupId=top.wuxiya.maven04 -DartifactId=maven04-demo -Dversion=1.0.0SNAPSHOT -Dpackage=top.wuxiya.maven04-demo
坐标和仓库
坐标是地址,用于找到对应的 jar 包,也就是 dependence
包括:groupId,artiFactId,version
仓库:本地和远程
maven 声明周期
每个证明周期是相互独立的,每个周期的内部有一定的依赖和顺序,运行之后的命令,自动执行之前的依赖
clean 清理项目 分为三个阶段:
pre-clean 执行清理前的工作
clean 清理上一次构建生成的所有文件
post-clean 执行清理后的文件
default 构建项目
compile test package install
site 生成项目站点,根据 pom
pre-site 之前的工作
site 生成项目的站点文档
post-site 生成之后的工作
site-deploy 发布生成的站点到服务器上
对于 maven 而言,所有的命令都是调用插件来使用的
pom.xml 常用元素介绍
:根元素,包含了一些约束信息 :指定了 pom 的版本,固定的 4.0.0 坐标信息:
项目坐标信息:
, , , :项目的描述名,一般在产生项目文档的时候使用 :项目的地址 :项目的描述 :开发人员的列表 :开源框架的许可证信息 :组织信息 :依赖列表 > :
依赖包的坐标信息:, , ; ; :依赖的范围,如 test,表示只在测试的范围有用; :true/false,用来设置依赖是否可选,默认是 false; :排除依赖传递列表 > :A->B->C,那么 C 对于 A 来说就是传递依赖 :依赖的管理 > > (并不会运行,而是用于子模块的继承) > 插件信息 > > 坐标信息 :用于在子模块中对于父模块的继承 :用于聚合多个 maven 项目,如果我们有很多个 maven 模块,那么可以一次性编译,而不是一个一个编译
依赖的范围
重点来看
如果要使用某一个框架,需要将框架加入到 classPath 中,这样就可以使用该框架。
maven 中有三种 classpath,分别是 编译,测试,运行。
junit 只存在于 test 的范围。
由此可见范围是用于管理依赖包的使用范围。
- compile:默认,三种都有效
- provided:测试和编译,如发布的时候容器里面已经有 API 了
- runtime:测试和运行,JDBC 的应用
- test:junit 的应用
- system:
- import:只在 management 中使用
依赖的传递
A->B->C
如果 A 引入 B 的 jar 包,那么会默认导入 C 包,这个时候如果不需要 C 包,我们在
依赖冲突
如果 A 依赖了同一个构件的不同版本,那么会产生冲突
- 短路优先:优先解析路径段的版本
A->B->C->X(jar)
A->D->X(jar)
那么优先解析短的路径 - 路径相同,优先解析先声明的版本
聚合和继承
聚合
对于不同的 maven 项目,我们需要相互调用的时候必须一个一个 install 到本地的仓库中才可以调用。
我们可以将不同的 maven 项目聚合一次性运行。
新建一个 maven 项目,packaging 用 pom,用
继承
新建一个 maven 项目,packaging 用 pom,删除 main 和 test,依赖放在 manegement 中。
在子项目中,