maven的学习之旅

什么是maven

首先,maven不是一个语言,不是一个框架,他是一个项目管理工具。

使用maven对项目进行构建,依赖管理

所以,maven与构建是挂了一个很大的勾勾的,搞清楚maven之前先要搞清楚构建是怎么个构建法的。

构建(build)

maven的出现之前,我们是如何构建我们的项目的?

  1. 创建一个项目
  2. 编写我们的代码
  3. 当我们编写完了之后,java文件会编译输出二进制文件
  4. 执行单元测试
  5. 然后打包部署到服务器
  6. 然后开启服务器
  7. 运行程序

根据上面的步骤,我突然对之前所说的构建有了一个比较清晰的定位了。


为什么会出现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
                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版本的,这样就不会产生依赖冲突了。

你可能感兴趣的:(maven的学习之旅)