Maven基础介绍

前言:写了半年的项目了,maven也一直在用,基本都是在复制粘贴,一直没深入了解过,今天找了个教程深入了解一下.课程来自:https://www.imooc.com/learn/443,知识比较老,但是其中关于maven项目的构建过程,依赖范围,传递,冲突等等讲的不错.

目录

第一章 maven的介绍与环境搭建

1.1 maven的介绍

1.2 maven的安装

1.2.1 maven的下载

1.2.2 环境变量的配置

1.3 maven的目录结构

第二章 maven核心知识

2.1 maven常用的构建命令

2.2 自动创建maven项目的骨架

2.2.1 第一种方式

2.2.2 第二种方式

2.3 maven中的坐标和仓库

2.4 在eclipse中安装maven插件

2.5 Maven的生命周期和插件 

2.6 pom.xml的常用元素介绍

2.7 依赖的范围

2.8 依赖传递

2.9 依赖冲突

2.9.1 短路优先原则

2.9.2 先声明先优先

2.10 聚合和继承

2.10.1 聚合

2.10.2 继承

第三章 如何构建web项目


第一章 maven的介绍与环境搭建

1.1 maven的介绍

maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.

它也是一套强大的自动化的构建工具,覆盖了我们的编译,测试,运行,清理,打包和部署.整个项目构建的周期.

提供了一个仓库的概念,最大限度的管理我们遇到的jar包,避免因环境配置不同而出现的问题.据说淘宝也是用maven管理项目的.

1.2 maven的安装

1.2.1 maven的下载

maven的官方网站:http://maven.apache.org/,点击对应的进行下载.

Maven基础介绍

解压后包含四个目录

bin目录包含maven的一些脚本,我们在window中输入mvn就可以调用它们,m2.conf是一个配置文件

boot包含一个类加载器的框架,maven使用它来加载自己的类型

conf是一些配置文件

lib是maven运行时需要的所有的类库,包括maven自身的和第三方的.

1.2.2 环境变量的配置

私人计算机配置哪个都行,多人使用的为了不影响他人要在用户中进行设置

新建环境变量,然后配置path

Maven基础介绍

 

Maven基础介绍

输入mvn -v可以显示mvn的版本号,即安装成功.

1.3 maven的目录结构

Maven基础介绍

 

maven conpile可以编译项目,编译后会和src目录在同一级下生成target目录,target下有四个文件夹,classes下存放编译后的文件,reports下存放的是测试报告,

Maven基础介绍

maven test可以运行test中的测试用例

maven package可以将项目打包成jar,将在target下面生成.

第二章 maven核心知识

2.1 maven常用的构建命令

target中存放的是字节码文件测试报告,install会把jar装到本地仓库中,本地仓库是一个存放jar包的地方.

Maven基础介绍

例子:我们有两个项目maven01与maven02,我们对maven01项目执行maven install,在maven02中即可在pom.xml将其引入使用.

maven01 install:

Maven基础介绍

在maven02中引入maven01,引入后会根据坐标(groupId,artifactId,version)去本地仓库中查找,如果本地没有会去*仓库中查找,并将其放入本地仓库*项目的使用.

Maven基础介绍

然后maven02项目就可以编译了

Maven基础介绍

2.2 自动创建maven项目的骨架

每次都自己创建文件夹太麻烦了,可以用插件来帮我们创建.有两种方式

2.2.1 第一种方式

首先创建项目目录maven03,然后进入命令提示符,输入如下命令

Maven基础介绍

根据提示输入自己的项目内容,最后回车即可

Maven基础介绍

2.2.2 第二种方式

输入如下命令,选择6,然后输入y.也可以自动生成.

Maven基础介绍

总结:

Maven基础介绍

2.3 maven中的坐标和仓库

坐标:maven世界中的依赖,插件,项目构件的输出都可以被称为构件,所有构件都通过坐标作为其唯一标识.

groupId,artifactId,version都可作为其唯一的坐标.

建议java的包名与groupId与artifactId相吻合.这样看起来更清晰与符合逻辑.

比如 com.imooc是公司网址反写,maven01是项目名,model是模块名,版本号是我们构件的版本.

Maven基础介绍

仓库:

仓库有本地仓库和远程仓库,如果本地没有会去远程仓库中查找,并将其放入本地仓库*项目的使用.如果远程仓库也找不到就会报错,maven默认提供的远程仓库的地址,打开maven目录下的lib目录,找到如下图所示的jar,打开其中文件夹,可以看到pom-4.0.0.xml,这是maven为我们提供的超级pom.xml,所有的项目都会继承它,将其他开会看到默认的全球*仓库的地址.shapshots表示我们禁止下载快照版本的构件.

Maven基础介绍

Maven基础介绍

 镜像仓库:

仓库都是位于国外的,有时会访问不到,所以我们可以配置国内的镜像仓库,在maven项目下的conf文件夹下,有一个settings.xml,在<mirrors>标签中写入下图所示,id表示镜像仓库的id,mirrorOf表示为哪个仓库配置镜像,name是镜像仓库的名字,url就是仓库的地址了.

Maven基础介绍

一般不会将本地仓库放在C盘,不然一重装系统啥的就没了,可以在settings中,进行如下配置改变本地仓库的位置.

Maven基础介绍

 

2.4 在eclipse中安装maven插件

这个安装就不详细说了,感兴趣的话可以去看上面给的视频地址,主要是在这里说一下为什么要更换项目的jre.

ecplipse是运行jre之上的,而maven要用到一些jdk的知识,所以要修改一下eclipse的jre,让其可以找到jdk,使用目录中私有的jre可以解决这个问题,有时候会提示需要用的tools.jar,而其是在jdk的lib下,而jdk并没有这个jar.所以会报错.eclipse默认指向的jre是和jdk同目录下的jre也就是公有的jre,我们要将其改为私有的jre,也就是jdk中的那个jre.至于为什么会有两套jre,以及他们的区别,请网上百度.

Maven基础介绍

 然后就可以进行一些compile,pakage等操作了

Maven基础介绍

2.5 Maven的生命周期和插件 

maven的命令

Maven基础介绍

项目的生命周期

Maven基础介绍

maven的生命周期,这三个生命周期相互独立, 每个生命周期包含一些阶段,每个阶段都是有顺序的.后面阶段会依赖前面的阶段,执行时会顺序执行.

Maven基础介绍

我们在执行pakage命令后会依次执行compile和test

Maven基础介绍

Maven基础介绍

Maven基础介绍

maven中的命令也是通过插件来执行的,我们来使用一个source插件,它可以将我们的源码打包.指定在pakage阶段要运行source插件,目标是为了jar-no-fork

Maven基础介绍


2.6 pom.xml的常用元素介绍

Maven基础介绍

developers是开发者,licenses是许可 

Maven基础介绍

 sope指的是依赖的范围,test指的是jar只在测试的范围内有用,如果在main中测试就会报错.

optional如果是true,项目必须显式引入该依赖.

Maven基础介绍

Maven基础介绍

可以在依赖管理中声明依赖列表,但是依赖并不会被运行,也就是不会被引入到实际的依赖中,主要用于定义在父模块中,子模块继承用的,比如多个maven项目中用到了junit,我们可以抽象出一个父类的模块,在父模块中对junit进行定义,其它子模块直接继承它就可以了.

Maven基础介绍

build对我们的构件行为进行支持.我们经常用到的是plugins.

parent用于子模块中,用于继承父模块,

modules用来聚合需要编译的项目.我们可以在其中指定多个模块进行编译.

2.7 依赖的范围

依赖就是项目中dependency标签下的项目,平时我们要使用某个jar包就要将其引入classpath中,然后就能使用它们中封装好的一些方法,maven中提供了三种classpath,分别是编译,测试,运行,我们平时使用的junit的范围就是test.

Maven基础介绍

 依赖范围就是控制依赖与三种classpath的关系的.

scope一共有六种

compile:默认的范围,编译运行测试都有效.

provided:在编译和测试的时候有效,比如ServletAPI,在运行的时候有web容器提供ServletAPI,加入了会产生冲突.

runtime:在测试和运行时候有效,比如jdbc的实现,只有真正运行项目时才需要提供jdbc真正的驱动.

test:只在测试的时候有效.

system:在编译和测试时有效,与本机系统相关联,可移植性差.如果我们要用javahome,可能移植到其它系统上就会导致路径不一样而出错.

import:导入的依赖范围,只使用在<dependencyManagement>标签中,表示从其它pom中继承过来的依赖.下面的例子就表示将A中的依赖导入到B中.

Maven基础介绍

2.8 依赖传递

比如在古惑仔中,山鸡跟南哥混,南哥跟B哥混,这就是一个依赖传递,山鸡依赖南哥,南哥依赖B哥.下面是三人的pom.xml.我们在编译之前要先将依赖安装,不然在本地库中没有,不能引入依赖.

    Maven基础介绍  Maven基础介绍 Maven基础介绍

都编译完后,可以看到山鸡的项目中有两个jar包,分别是南哥和B哥的jar包,然而山鸡只引入了南哥的jar包,没有引入B哥的jar包,这就i是依赖传递.

Maven基础介绍

 如果山鸡只想引入南哥jar包,不想引入B哥的jar包,可以用<exclusions>,这样,山西的项目中就不会有B哥的jar包了.

Maven基础介绍

Maven基础介绍

2.9 依赖冲突

依赖就是,项目就依赖了不同版本的同一个依赖,依赖冲突遵循两条原则

2.9.1 短路优先原则

这里的X版本是不同的.最后引入到A中的是路径短的版本的X.

Maven基础介绍

2.9.2 先声明先优先

即在pom.xml声明的顺序.

Maven基础介绍

 

2.10 聚合和继承

2.10.1 聚合

maven中我们想将多个项目install安装到本地仓库中,这就需要一次执行install命令,有种聚合的方法可以将它们放在一起运行.这种方式称之为聚合.

新建一个项目,将需要install的项目引入,然后对项目执行install即可.

Maven基础介绍

 

2.10.2 继承

在b哥,南哥,山鸡三个项目中,都用junit这个项目.这样就出现了很多重复的地方,我们可以像在java中一样,把它们抽象成一个父类,建立一个新的项目.新的项目的pom.xml,最后将packaging改为pom

Maven基础介绍

下面我们进入B哥的pom.xml,引入新项目,这样junit就被继承过来了.

Maven基础介绍

 

第三章 如何构建web项目

新建一个maven项目,选择webapp选项,配置一下名字.

Maven基础介绍

建立之后补全目录结构,发现index.jsp有叉号,引入ServletAPI.

检查BuildPath中的Output folder,确认项目的输出目录是target下的classes文件夹,

检查Project Facets,确保有Dynamic Web Module选项.

Maven基础介绍

修改部署时的默认配置 Deployment Assembly,去掉测试目录的代码,

Maven基础介绍

找到服务器jetty的插件,引入到pom.xml中,输入jetty:run即可运行

Maven基础介绍

Maven基础介绍

如果想改成打包时就运行,输入clean package即可运行.

Maven基础介绍

如果要用tomcat呢,改成如下即可.

Maven基础介绍