1.什么是maven?
由于官方文档咬文嚼字,难以理解,这里就不介绍他的说法。(要是想知道,可以问度娘)。
在我看来,maven就是通过一个配置文件(pom.xml),合理地叙述项目间的依赖关系。但是这种依赖关系不能我们手动去添加,而是通过maven这个工具帮助我们来管理。
2.maven仓库
通过pom.xml文件就可以获取到相应的jar包。但是这些jai包是哪里来的呢?答案就是仓库。
仓库分为:本地仓库;第三方仓库;中央仓库。
本地仓库:Maven会将工程中依赖的jar包从远程仓库上下载到本地的磁盘上进行保存。这个本地文件就是本地仓库。
第三方仓库:又称为私服,一般是由公司自己设置,只为本公司内部使用(连接私服,需要单独配置)。
中央仓库:它是maven默认的仓库,由maven自己维护,里面包含了几乎所有需要的jar包。我们项目需要的依赖如果没有,那么会默认从中央仓库中下载。
3.maven java项目结构
simple
---pom.xml 核心配置,在项目的根目录下
---src
---main
---java java源码目录
---resources java配置文件目录
---test
---java 测试源码目录
---resources 测试配置目录
4.maven web项目结构
pom.xml 核心配置
---src
---main
---java java源码
---resources java配置
---webapp
---WEB-INF
---web.xml
---test 测试
target 输出目录
5.maven的操作命令
编译:mvn compile main/java目录下编译生成class文件(target目录下)
测试:mvn test test/java目录编译
清理:mvn clean 删除target目录,也就是将class文件删除
打包:mvn package 生成压缩文件:java项目就是jar包,web项目就是war包,放在target目录下
安装:mvn install 将压缩文件(jar包或war包)上传到本地仓库
部署|发布:mvn deploy 将压缩文件上传到私服
6.maven的生命周期(重点!!!面试常问!!!)
maven有三套生命周期:
1.clean周期:主要是用来清理本地仓库中上一次构建(jar包或war包)的文件,即删除target目录
2.默认周期(也可以理解为一个项目打包的完整过程):
2.1 process-resouces 编译资源文件阶段
2.2 compile 编译java文件,生成class文件
2.3 process-test-resources 将资源文件加载到测试目录下面去
2.4 test-compile 对编译进行测试,生成测试的class文件
2.5 test 运行时期的测试
2.6 package 打包项目,生成对应的jar包或war包
2.7 install 将生成的包上传到本地仓库
2.8 deploy 部署|发布包到远程仓库
3.site周期
3.1 site产生项目的站点文档
3.2 site-deploy 将项目的站点文档部署到服务器
7.maven的pom.xml文件(重点!!!)
maven的三个坐标groupId、artifactId、version,这三个坐标是基本坐标,不可或缺。除这三个之外,还有其他的,要理解。
type:依赖的类型,依赖的是jar包还是war包。(默认为jar)
optional:标记的依赖是否可选,默认为false,(比如在struts2中内置了log4j,不管struts2中有没有logj,项目都可以正常运行,知识提示的信息多和少的关系,这个时候,就可以用这个属性来决定是否要使用这个。)
. exclusions:排出传递依赖,解决jar包冲突。(依赖就是A依赖B,B依赖C这种关系。加载A的时候,会把B也加载进来)。
scope:依赖范围,意思就是通过maven加载进来的jar包作用范围是什么,范围包括编译期,运行期和测试期。
8.jar包冲突解决
这里说一下我在运行项目时总是出现的两个异常,NoSuchMethodError和ClassNotFounfException,如果你的项目出现这两个异常,那95%的可能性是出现jar包冲突了。
8.1 为什么产生jar包冲突?
举个例子,假如你引进了Ajar包,然而Ajar包又依赖Bjar包,但是Bjar包的版本较低,那么在编译时期,用的是Ajar包中的方法,在运行时期,两个jar包都会加载,这时候,就会发现Bjar包中没有这个方法,就会报jar包冲突错误。
8.2 如何解决jar包冲突?
maven的默认处理方式:1.最短路径优先(就是依赖关系中层级较少的优先加载)
2.最先申明优先(当出现两个不同版本的jar包时,会优先加载先申明的jar包)
移除依赖:可以借助maven Helper插件中的Dependency Analyzer,来分析冲突的jar包,然后在对应标红版本的jar上面点击execlude,就可以将该jar包移除。