http://www.mvnrepository.com 可以查找pom.xml各种标签使用示例
常用命令
构件:在Maven中,任何依赖(jar包,tomcat等),或项目(自己打包的jar,war等)输出都可成为构件。每个构件都有自己的唯一标识(唯一坐标),由groupId,artifactId,和version等信息构成,由此,Maven就可以对构件进行版本控制,管理。
groupId:当前Maven构件隶属的项目名。实际开发中,项目往往会模块化开发,如spring-core,spring-aop等,他们都是Spring项目下不同的模块。命名方式与Java包名类似,通常是域名的反向书写。如ch.qos.logback,事实上项目管理组织的网址是:http://logback.qos.ch/ 。(必须)
artifactId:隶属项目中的模块名。(必须)
version:当前版本。(必须)
packaging:打包方式,如jar,war... (必须)
classifier:帮助定义构建输出的一些附属构件。如spring-core.jar,还生成有文档javadoc.jar,源码sources.jar。
构件特性
1.构件具有依赖传递。例如:项目依赖构件A,而构件A又依赖B,Maven会将A和B都视为项目的依赖。
2.构件之间存在版本冲突时,Maven会依据 “短路优先” 原则加载构件。此外,我们也可以在POM.XML中,使用<exclusions></exclusions>
显式排除某个版本的依赖,以确保项目能够运行。
(1)项目依赖构件A和B,构件A → C → D(version:1.0.0),构件B → D(version:1.1.0),此时,Maven会优先解析加载D(version:1.1.0)。
(2)项目依赖构件A和B,构件A → D(version:1.0.0), 构件B → D(version:1.1.0),此时,Maven会优先解析加载D(version:1.0.0)。
Maven坐标
坐标就好比每一个Java构件的身份证一样。Maven的世界是拥有非常多的Java构件的,可能是jar、可能是war、也可能是其他的一些东西。假如Maven中没有坐标的概念,我们是无法来区分这些构件的,所以我们要唯一标识每一个构件。不然就和传统的手工方式一样,你需要spring就去spring下载spring的包,需要mysql又去mysql下载mysql的包,没有统一的规范又怎么能够自动化的去依赖这些构件。
Maven便给我们制定了一套规则那就是使用坐标进行唯一标识。Maven的坐标元素包括groupId、artifactId、version、packaging、classfier。只要我们提供正确的坐标元素,Maven就能找到对应的构件,首先去你的本地仓库查找,没有的话再去远程仓库下载。如果没有配置远程仓库,会默认从中央仓库地址(http://repo1.maven.org/maven2)下载构件,该中央仓库包含了世界上大部分流行的开源项目构件,但不一定所有构件都有,我在以前的开发中就遇到过找不到oracle数据库jar包的问题,不知道现在是否依然如此。(简而言之就是构件通过坐标作为其唯一标识)
groupId:定义当前Maven项目隶属的实际项目。首先,Maven项目和实际项目不一定是一对一的关系。比如SpringFrameWork这一实际项目,其对应的Maven项目会有很多,如spring-core,spring-context等。这是由于Maven中模块的概念,因此,一个实际项目往往会被划分成很多模块。其次,groupId不应该对应项目隶属的组织或公司。原因很简单,一个组织下会有很多实际项目,如果groupId只定义到组织级别,而后面我们会看到,artifactId只能定义Maven项目(模块),那么实际项目这个层次将难以定义。最后,groupId的表示方式与Java包名的表达方式类似,通常与域名反向一一对应。上例中,groupId为junit,是不是感觉很特殊,这样也是可以的,因为全世界就这么个junit,它也没有很多分支。(一般就是组织名,公司网址的反写加项目名)
artifactId: 该元素定义当前实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀。比如上例中的junit,junit就是实际的项目名称,方便而且直观。在默认情况下,maven生成的构件,会以artifactId作为文件头,如junit-3.8.1.jar,使用实际项目名称作为前缀,就能方便的从本地仓库找到某个项目的构件。(项目名-模版名)
version: 该元素定义了使用构件的版本,如上例中junit的版本是3.8.1,你也可以改为4.0表示使用4.0版本的junit。(版本号)
第一个0表示大版本号
第二个0表示分支版本号
第三个0表示小版本号
0.0.1
snapshot 快照
alpha 内部测试
beta 公测
Release 稳定
GA 正式发布
packaging:定义Maven项目打包的方式,使用构件的什么包。首先,打包方式通常与所生成构件的文件扩展名对应,如上例中没有packaging,则默认为jar包,最终的文件名为junit-3.8.1.jar。也可以打包成war等。(代码所在的包名)
classifier: 该元素用来帮助定义构建输出的一些附件。附属构件与主构件对应,如上例中的主构件为junit-
仓库
本地仓库与远程仓库。
首先去你的本地仓库查找,没有的话再去远程仓库下载。如果没有配置远程仓库,会默认从中央仓库地址(http://repo1.maven.org/maven2)下载构件,该中央仓库包含了世界上大部分流行的开源项目构件,但不一定所有构件都有。
maven的生命周期
clean 清理项目
pre-clean 执行清理前工作
clean 清理上一次构建生成的所有文件
post-clean 执行清理后的文件
default 构建项目(最核心)
compile test package install 组成default生命周期而且他们依次执行(eg:执行package同时也会执行前面两步)
site 生成项目站点
pre-site 在生成项目站点前要完成的工作
site 生成项目站点文档
post-site 在生成项目站点后要完成的工作
site-deploy 发布生成站点到服务器
maven依赖范围<scope>
标签的6种属性
compile:默认的范围,编译测试运行都有效
provided:在编译和测试时有效
runtime:在测试和运行有效
test:在测试时有效
system:与本机系统相关联,可移植性差
import:导入的范围,它只使用在dependencyManagement中,表示从其他的pom中导入dependecy的配置
依赖冲突
1.短路优先
优先解析路径短的版本
2.先声明先优先
如果路径长度相同,则谁先声明,先解析谁
内容来源于网络,如有侵权,请联系作者删除!