您的位置:首页 > 编程语言 > Java开发

Maven学习笔记(二)

2016-07-13 21:05 190 查看

一、Maven中的坐标和仓库

构件:在Maven中,任何一个依赖、插件、项目构建的输出都可以被称为构件,所有的构件都是通过坐标来作为唯一的标识的。
仓库:仓库是用来管理项目的依赖的,仓库又分为本地仓库和远程仓库。本地仓库是指本机存储依赖的位置,远程仓库是指在远程服务器上存储依赖的位置。本地仓库默认放在用户目录下的.m2/repository文件夹下,我们也可以修改本地仓库的位置,修改{$MAVEN_HOME}/conf/settings.xml,新增如下内容即可:
<localRepository>/path/to/local/repo</localRepository>

镜像仓库:就是仓库A提供了和仓库B一样的功能,因为某些原因,访问仓库B的速度比较慢,这时就可以使用镜像仓库A,通过访问镜像仓库来下载依赖,一旦配置了镜像仓库,所有针对原仓库的访问都将转到镜像仓库。要配置镜像仓库就需要修改{$MAVEN_HOME}/conf/settings.xml文件,修改mirrors标签,添加mirror子标签,如下:
<mirror>
<span style="white-space:pre">	</span><id>maven.net.cn</id>镜像仓库id
<mirrorOf>central</mirrorOf>为哪个仓库配置镜像
<name>Human Readable Name for this Mirror.</name>
<url>http://maven.net.cn/content/groups/public</url>
</mirror>

二、Maven生命周期

一个项目的完整构建过程包括:清理、编译、测试、打包、集成测试、验证、部署。而Maven有三套独立的生命周期:clean(清理项目)、default(构建项目)、site(生成项目站点),要注意这三套生命周期是分别独立的,并不是一个整体,我们可以仅仅使用clean来完成清理工作,仅使用site来生成项目站点。

Maven有三套独立的生命周期,每套生命周期又有各个不同的阶段,每个阶段依次执行,后面的阶段依赖于前面的阶段执行完成。例如编译阶段compile要早于打包阶段package,如果我们执行mvn package,则会发现Maven先执行compile、test再执行package,package是依赖于compile和test执行完成的。现在介绍一下各个生命周期的主要的阶段。
1、clean生命周期:pre-clean执行清理前的工作;clean清理上一次构建生成的所有文件;post-clean执行清理后的文件

2、default生命周期(最核心):compile,test,package,install
3、site生命周期:pre-site在生成项目站点前要完成的工作,site生成项目的站点文档,post-site在生成站点后要完成的工作,site-deploy发布生成的站点到服务器上

三、pom.xml的常用元素

Maven使用项目对象模型(Project Object Model,POM)来配置,项目对象模型存储在 pom.xml 的文件中,下面简单介绍一下pom.xml文件里面的常用元素,具体的各个元素的详细用法可以去Maven的官网上查看相关文档。

modelVersion指定了当前pom的版本,固定值4.0.0

坐标信息:groupId反写的公司网址+项目名,artifactId项目名+模块名,version第一个0表示大版本号,第二个0表示分支版本号,第三个0表示小版本号,snapshot快照,alpha内部测试,beta公测,release稳定,GA正式发布,packaging Maven的打包方式,不指定默认是jar,有war,zip,pom

name项目描述名,产生项目文档时使用

url项目地址

description项目描述

developers开发人员列表

licenses许可证信息

organization组织信息

dependencies依赖列表,可以包含多个dependency,里面包含依赖的坐标,groupId,artifactId,version,type,scope依赖范围,optional(true/false)设置依赖是否可选,默认是false,exclusions排除依赖传递列表

dependencyManagement依赖的管理,并不会在项目中运行

build对构件的行为提供支持,经常用到plugins插件列表,plugins包含多个plugin,里面包含插件的坐标,groupId,artifactId,version

parent用于在子模块中对于父模块pom的继承

modules聚合运行多个maven项目

四、依赖的范围

Java中如果在项目中想使用某一框架,就需要将该框架的jar包引入项目的classpath路径中,Maven提供了三种classpath:编译、测试、运行,Maven依赖的范围就体现在dependency标签下的scope子标签的值。

scope的值:compile是默认的范围,编译测试运行都有效,如果没有指定默认为这个。
provided在编译和测试时有效,比较典型的就是Servlet API的依赖,因为Eclipse在新建web工程时不会提供Servlet的依赖,所以需要手动添加Servlet依赖,但是当将项目部署到容器中时,容器提供了Servlet支持,所以就不需要再添加额外的依赖了。

runtime在测试和运行时有效,比较典型的就是JDBC的Driver驱动,当编写JDBC代码时不需要手动将对应的Driver依赖添加进来,但是在测试和运行JDBC代码时需要相应数据库的Driver,这时就需要添加依赖了。

test只有在测试时有效,典型的就是JUnit单元测试工具,只在测试时用到。

system与provided一样在编译和测试时有效,但是与本机系统相关联,可移植性差。

import只用在dependencyManagement中表示从其他pom中继承的依赖,用于将其他的pom引入当前项目。

五、依赖的传递

A依赖于B,而B又依赖于C,则A依赖于C,因此如果新建一个项目A,则默认会将B和C都引入。要想A不依赖于C,则需要用exclusions标签将C的依赖排除,exclusions下设置exclusion,然后将C项目的坐标添加即可。

六、依赖的冲突

如果有两个不同的项目A和B依赖于一个相同构件的不同版本,对于同时依赖于A和B的项目C来说有两个原则:

1、短路优先:优先解析路径短(依赖路径)的版本,例如C依赖A的路径为C->D->E->A,C依赖B的路径为C->B,很明显C依赖B的路径更短,所以Maven会将B依赖的构件版本引入。

2、先声明先优先:如果路径长度相同,则谁先声明,先解析谁。如果C依赖A和B的路径长度是相通的,那么检查pom文件时先声明依赖的是谁,谁先声明就依赖谁。

七、聚合和继承

聚合和继承我学得不是很详细,详细的讲解可以参考这篇文章这篇文章,其中第二篇文章有一点错误,maven 聚合打包的方式应该为
pom,而第二篇文章介绍的是packaging。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  maven java 管理