前言:写了半年的项目了,maven也一直在用,基本都是在复制粘贴,一直没深入了解过,今天找了个教程深入了解一下.课程来自:https://www.imooc.com/learn/443,知识比较老,但是其中关于maven项目的构建过程,依赖范围,传递,冲突等等讲的不错.
目录
第一章 maven的介绍与环境搭建
1.1 maven的介绍
maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.
它也是一套强大的自动化的构建工具,覆盖了我们的编译,测试,运行,清理,打包和部署.整个项目构建的周期.
提供了一个仓库的概念,最大限度的管理我们遇到的jar包,避免因环境配置不同而出现的问题.据说淘宝也是用maven管理项目的.
1.2 maven的安装
1.2.1 maven的下载
maven的官方网站:http://maven.apache.org/,点击对应的进行下载.
解压后包含四个目录
bin目录包含maven的一些脚本,我们在window中输入mvn就可以调用它们,m2.conf是一个配置文件
boot包含一个类加载器的框架,maven使用它来加载自己的类型
conf是一些配置文件
lib是maven运行时需要的所有的类库,包括maven自身的和第三方的.
1.2.2 环境变量的配置
私人计算机配置哪个都行,多人使用的为了不影响他人要在用户中进行设置
新建环境变量,然后配置path
输入mvn -v可以显示mvn的版本号,即安装成功.
1.3 maven的目录结构
maven conpile可以编译项目,编译后会和src目录在同一级下生成target目录,target下有四个文件夹,classes下存放编译后的文件,reports下存放的是测试报告,
maven test可以运行test中的测试用例
maven package可以将项目打包成jar,将在target下面生成.
第二章 maven核心知识
2.1 maven常用的构建命令
target中存放的是字节码文件测试报告,install会把jar装到本地仓库中,本地仓库是一个存放jar包的地方.
例子:我们有两个项目maven01与maven02,我们对maven01项目执行maven install,在maven02中即可在pom.xml将其引入使用.
maven01 install:
在maven02中引入maven01,引入后会根据坐标(groupId,artifactId,version)去本地仓库中查找,如果本地没有会去中央仓库中查找,并将其放入本地仓库中供项目的使用.
然后maven02项目就可以编译了
2.2 自动创建maven项目的骨架
每次都自己创建文件夹太麻烦了,可以用插件来帮我们创建.有两种方式
2.2.1 第一种方式
首先创建项目目录maven03,然后进入命令提示符,输入如下命令
根据提示输入自己的项目内容,最后回车即可
2.2.2 第二种方式
输入如下命令,选择6,然后输入y.也可以自动生成.
总结:
2.3 maven中的坐标和仓库
坐标:maven世界中的依赖,插件,项目构件的输出都可以被称为构件,所有构件都通过坐标作为其唯一标识.
groupId,artifactId,version都可作为其唯一的坐标.
建议java的包名与groupId与artifactId相吻合.这样看起来更清晰与符合逻辑.
比如 com.imooc是公司网址反写,maven01是项目名,model是模块名,版本号是我们构件的版本.
仓库:
仓库有本地仓库和远程仓库,如果本地没有会去远程仓库中查找,并将其放入本地仓库中供项目的使用.如果远程仓库也找不到就会报错,maven默认提供的远程仓库的地址,打开maven目录下的lib目录,找到如下图所示的jar,打开其中文件夹,可以看到pom-4.0.0.xml,这是maven为我们提供的超级pom.xml,所有的项目都会继承它,将其他开会看到默认的全球中央仓库的地址.shapshots表示我们禁止下载快照版本的构件.
镜像仓库:
仓库都是位于国外的,有时会访问不到,所以我们可以配置国内的镜像仓库,在maven项目下的conf文件夹下,有一个settings.xml,在<mirrors>标签中写入下图所示,id表示镜像仓库的id,mirrorOf表示为哪个仓库配置镜像,name是镜像仓库的名字,url就是仓库的地址了.
一般不会将本地仓库放在C盘,不然一重装系统啥的就没了,可以在settings中,进行如下配置改变本地仓库的位置.
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,以及他们的区别,请网上百度.
然后就可以进行一些compile,pakage等操作了
2.5 Maven的生命周期和插件
maven的命令
项目的生命周期
maven的生命周期,这三个生命周期相互独立, 每个生命周期包含一些阶段,每个阶段都是有顺序的.后面阶段会依赖前面的阶段,执行时会顺序执行.
我们在执行pakage命令后会依次执行compile和test
maven中的命令也是通过插件来执行的,我们来使用一个source插件,它可以将我们的源码打包.指定在pakage阶段要运行source插件,目标是为了jar-no-fork
2.6 pom.xml的常用元素介绍
developers是开发者,licenses是许可
sope指的是依赖的范围,test指的是jar只在测试的范围内有用,如果在main中测试就会报错.
optional如果是true,项目必须显式引入该依赖.
可以在依赖管理中声明依赖列表,但是依赖并不会被运行,也就是不会被引入到实际的依赖中,主要用于定义在父模块中,子模块继承用的,比如多个maven项目中用到了junit,我们可以抽象出一个父类的模块,在父模块中对junit进行定义,其它子模块直接继承它就可以了.
build对我们的构件行为进行支持.我们经常用到的是plugins.
parent用于子模块中,用于继承父模块,
modules用来聚合需要编译的项目.我们可以在其中指定多个模块进行编译.
2.7 依赖的范围
依赖就是项目中dependency标签下的项目,平时我们要使用某个jar包就要将其引入classpath中,然后就能使用它们中封装好的一些方法,maven中提供了三种classpath,分别是编译,测试,运行,我们平时使用的junit的范围就是test.
依赖范围就是控制依赖与三种classpath的关系的.
scope一共有六种
compile:默认的范围,编译运行测试都有效.
provided:在编译和测试的时候有效,比如ServletAPI,在运行的时候有web容器提供ServletAPI,加入了会产生冲突.
runtime:在测试和运行时候有效,比如jdbc的实现,只有真正运行项目时才需要提供jdbc真正的驱动.
test:只在测试的时候有效.
system:在编译和测试时有效,与本机系统相关联,可移植性差.如果我们要用javahome,可能移植到其它系统上就会导致路径不一样而出错.
import:导入的依赖范围,只使用在<dependencyManagement>标签中,表示从其它pom中继承过来的依赖.下面的例子就表示将A中的依赖导入到B中.
2.8 依赖传递
比如在古惑仔中,山鸡跟南哥混,南哥跟B哥混,这就是一个依赖传递,山鸡依赖南哥,南哥依赖B哥.下面是三人的pom.xml.我们在编译之前要先将依赖安装,不然在本地库中没有,不能引入依赖.
都编译完后,可以看到山鸡的项目中有两个jar包,分别是南哥和B哥的jar包,然而山鸡只引入了南哥的jar包,没有引入B哥的jar包,这就i是依赖传递.
如果山鸡只想引入南哥jar包,不想引入B哥的jar包,可以用<exclusions>,这样,山西的项目中就不会有B哥的jar包了.
2.9 依赖冲突
依赖就是,项目就依赖了不同版本的同一个依赖,依赖冲突遵循两条原则
2.9.1 短路优先原则
这里的X版本是不同的.最后引入到A中的是路径短的版本的X.
2.9.2 先声明先优先
即在pom.xml声明的顺序.
2.10 聚合和继承
2.10.1 聚合
maven中我们想将多个项目install安装到本地仓库中,这就需要一次执行install命令,有种聚合的方法可以将它们放在一起运行.这种方式称之为聚合.
新建一个项目,将需要install的项目引入,然后对项目执行install即可.
2.10.2 继承
在b哥,南哥,山鸡三个项目中,都用junit这个项目.这样就出现了很多重复的地方,我们可以像在java中一样,把它们抽象成一个父类,建立一个新的项目.新的项目的pom.xml,最后将packaging改为pom
下面我们进入B哥的pom.xml,引入新项目,这样junit就被继承过来了.
第三章 如何构建web项目
新建一个maven项目,选择webapp选项,配置一下名字.
建立之后补全目录结构,发现index.jsp有叉号,引入ServletAPI.
检查BuildPath中的Output folder,确认项目的输出目录是target下的classes文件夹,
检查Project Facets,确保有Dynamic Web Module选项.
修改部署时的默认配置 Deployment Assembly,去掉测试目录的代码,
找到服务器jetty的插件,引入到pom.xml中,输入jetty:run即可运行
如果想改成打包时就运行,输入clean package即可运行.
如果要用tomcat呢,改成如下即可.