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。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- maven学习
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序