什么是maven
首先,maven不是一个语言,不是一个框架,他是一个项目管理工具。
使用maven对项目进行构建,依赖管理
所以,maven与构建是挂了一个很大的勾勾的,搞清楚maven之前先要搞清楚构建是怎么个构建法的。
构建(build)
maven的出现之前,我们是如何构建我们的项目的?
- 创建一个项目
- 编写我们的代码
- 当我们编写完了之后,java文件会编译输出二进制文件
- 执行单元测试
- 然后打包部署到服务器
- 然后开启服务器
- 运行程序
根据上面的步骤,我突然对之前所说的构建有了一个比较清晰的定位了。
为什么会出现maven
所有新事物的出现必定是因为他之前太过麻烦了
这句话能够解释大部分计算机新起事物的理由。
在上面的所描述的构建流程里面,我们很清晰地能感受到一种繁杂迎面而来,都是写过无数项目的真实体验。
我们每次导入一个jar包是多么的痛苦...
我们要手动测试所有的单元测试...
我们要手动打包我们的项目...
我们要手动地将我们的项目部署到服务器上门...
我想起来我之前写项目的时候总是忘记把项目部署到服务器上...
那么maven的作用到底是什么呢?
maven可以帮我们把上面的流程全部做完,并且可以一步做完。
maven的作用是什么
1.maven的构建
maven执行步骤:清理
--》编译
--〉测试
--》报告
--〉打包
--》部署
maven可以一步帮我们执行完所有,当然我们也可以手控操作这些步骤:
maven的不同步骤都是对应着不同的简单的指令
-
清理
: clean -
编译
: compile -
打包
: package
2.maven的导入jar包的操作:解放双手
项目里会有一个文件叫做pom.xml,我们的包的导入都是写在这个文件里面。
与之前不同的是,之前我们是真正事实得在做导入这个一个动作,但是pom文件就类似于一个清单:
我们在清单里面罗列出我们想要的包以及这些包的版本。
最后,当我们mvn install
的时候,maven团队会根据我们的pom文件,在他们维护的maven仓库
里面下载jar包。我们减少了我们每次手动导入jar包这样一个非常繁琐的过程!
3.maven仓库
-
本地仓库
:我们项目根据pom.xml清单下载下来的项目就是下载到本地仓库里面的;当然并不是一个项目一个本地仓库,而是一个电脑一个本地仓库,所以,当我们第一个项目下载了xx.jar,第二个项目当再次需要xx.jar的时候,就不需要从远程仓库下载了,从本地仓库拿就好了。
这个本地仓库不需要我们自定义,是默认设置的。当我们接触了一段时间的maven,我们一定会发现有这么一个文件夹叫做.m2
,这个就是本地仓库。
远程仓库
:互联网仓库,可以是在互联网内也可以是在局域网内。中央仓库
:服务于整个互联网,有maven团队自己维护,里面有非常多的jar包。
maven命令
mvn clean
:清理,删除target目录里面的内容(生成的 .class 文件)
mvn compile
:编译,将java文件编译成.class文件,并且放在target文件夹里面
mvn test
:测试,会执行src/test目录下面的单元测试类
mvn package
:打包,将java工程打包成jar包,将web工程打包成war包
mvn install
:安装,将maven打包好的包发布到本地仓库
mvn deploy
:部署,将包复制到远程仓库
maven生命周期
clean生命周期阶段:pre-clean
-->clean
-->post-clean
default生命周期阶段:compile
-->test
-->package
-->install
-->deploy
site生命周期阶段:pre-site
-->site
-->post-site
-->site-deploy
site:生成项目的站点文档
如果我们执行了mvn clean
,那么真正执行的其实是pre-clean 和 clean 两个,
同理,如果我们执行了mvn install
,那么我们执行的其实是,compile,test,package,install,
总结,执行当前命令并不是只执行当前阶段,而是从最初,执行到当前阶段截止。
但是,如果我们想要执行两个阶段的生命周期呢?比如我们想要执行clean 以及 intall:
mvn clean install
我们如此命名便可。
pom.xml
前面提到了很多次pom.xml,我们知道他是一个jar包的罗列清单。那么这个清单的书写格式我们肯定是必须知道的,因为我们导入jar包现在全靠写pom.xml了。
项目名称
模块名称
版本
依赖范围
当我们创建一个maven项目的时候,上面的选择也是我们所要定义的。
一般我们会把groupId
设置成我们的包名+项目名,grtifactId
设成我们的项目名;
com.yq.test
TestMavenProject
1.8
utf-8
configuration里面配置的1.8指的是我们的jdk版本是1.8的。
encoding很显而易见是我们的编码。
maven进阶之jar包依赖冲突
1.什么是依赖冲突?
此时,我们有a包和b包,但是a包和b包里面同时依赖了c包(不同版本),此时我们有一个类是c包里面的。
当我们需要运用这个类的时候,系统就懵逼了,我们到底要的是哪一个版本的c包呢?
2.如何调解依赖冲突?
谁先声明谁优先
在pom文件里面,如果我a包先声明,那么我们就优先取a包里面的c包。谁近谁优先
在pom文件里,比如:
a---》xx-1.jar
a---〉b----》xx-2.jar
由上因为xx-1.jar离a包其实最近,所以优先选择xx-1.jar
3.如何避免产生依赖冲突?
锁定版本。xx包,我们只用1版本的,不用2版本的,这样就不会产生依赖冲突了。