Maven 知识梳理
Maven应用之广泛不用多说,我也用maven很久了。趁着现在时间比较宽裕,这里对maven的知识做一个系统总结。
一:什么是maven
一句话:项目的构建,管理,jar包管理的工具。
二:maven 的环境搭建
网上资料太多,我这里不在专门写,可参考下边的这篇文章。
http://www.cnblogs.com/quanyongan/archive/2013/04/17/3025971.html
三:maven约定好的目录结构:
四:maven常用的构建命令
mvn -v 查看maven的版本
mvn -compile 编译我们的代码
mvn -test 测试我们的代码,默认回去执行test的里边的使用@Test小时的测试方法
clean 删除targert(maven生成的目标文件),
install 将jar包安装到本地仓库;
五:Maven的坐标,构件,和仓库
坐标:
建议在创建maven项目的时候,包名应该和groupId和artifactId相吻合。这样看起来就更加清晰,复合逻辑,也便于搜索。
5.1 仓库
本地仓库和全球仓库
六:Maven生命周期
clean:清理项目
clean的生命周期包括三个阶段:
pre-clean 执行清理前的工作。
clean 执行上一次构建生成的所有文件
post clean 执行清理后的文件
default 构建项目(最核心)
compile
test
package
install
site 根据pom文件生成项目站点
pre-site 在生成站点前所完成的工作
site:生成项目的站点文档
post-site 在生成项目站点后要完成的工作
site-deploy 发布生成的站点在服务器上
执行生命周期中的某个阶段,其前边的阶段会顺序的依次执行。
在生命周期中插入一个小插件实例:
这个插件的作用是:在进行package阶段的时候,会对项目的源码进行打包。
七:pom文件
pom文件的作用是maven项目的核心管理文件,用于项目描述,组织管理,依赖管理,构建信息的管理。
packing是指打包方式。比如是jar还是war包,还是zip或者pom。
其中在 标签中可能还含有标签,改标签的作用为指定该依赖的作用范围。
其中三种classpath
1 编译
2 测试
3 运行
scope通过控制对应的classpath,来控制作用范围;
scope 的值有下边的几种:
compile:默认的范围,编译测试运行都有效
provided:编译测试的时候有效,比如使用servlet的api的时候,我们可以通过maven来进行依赖,但是在运行的时候不能将其计入进去,因为web容器已经包含了servlet,如果maven再将其打包到calsspath中,就会产生冲突。
runtime:在测试和运行的时候有效。
test:在测试的时候有效。
system:也是在测试和运行的时候有效,但是跟本地系统的关联性特别强,可移植性特别差;比如他会依赖本地的java_home,一直到其他的系统,就会出现问题。
import:导入的范围,他只使用在dependency中,表示从其他的pom中导入dependency的配置。
例如:
八:maven的传递依赖
A依赖B,B依赖C,则A依赖C;
排除依赖
依赖原则
短路优先
比如
A -> B -> C ->D1 (JAR)
A->C->D2(JAR)
其中,D1和D2代表不同的版本。
在上边的情况下,A会优先解析D2。