Maven战笔记 - 01 简介、安装和配置、入门、坐标和依赖、仓库

《Maven实战》(徐晓斌著 机械工业出版社)阅读笔记1-6章
简介、安装和配置、入门、坐标和依赖、仓库

Maven作为构建工具,不仅能帮我们自动化构建,还能抽象构建过程,提供构建任务实现,它跨平台,对外提供一致操作接口。
Maven通过一组坐标能找到任何一个Java类库(如jar文件)。我们可以借助它有序地管理依赖,轻松解决繁杂的依赖问题。

通常需要设置MAVEN_OPTS值为-Xms128m-Xmx512m,因Java默认最大可用内存往往不能满足Maven运行需要,很容易得到java.lang.OutOfMemeoryError异常,故,推荐一开始就配置该变量。

由于历史原因,Maven核心插件之一compiler默认只支持编译Java1.3,因此需要配置该插件使其支持Java5+

Maven最主要的命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。
执行test前会先执行compile,执行package前会先执行test,执行install前会执行package。

为生成可执行的jar文件,需借助maven-shade-plugin插件。

使用maven archetype创建项目骨架:
Maven 3,mvn archetype:generate
Maven 2,mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5:generate

任何构件都可用Maven坐标唯一标识,只要提供正确坐标元素,Maven就能找到对应的。
Maven坐标元素包括groupId、artifactId、version、packaging、classifier。
·groupId:定义当前Maven项目隶属的实际项目。
·artifactId:定义实际项目中一个Maven项目(模块),推荐使用实际项目名称作为artifactId前缀。
·version:定义Maven项目当前版本。
·packaging:定义Maven项目打包方式。
·classifier:帮助定义构建输出的一些附属构件。注,不能直接定义项目classifier,因附属构件不是项目直接默认生成的,而是由附加的插件帮助生成。
前3必选,第4可选,第5不可直接定义。

项目构件文件名与坐标相对应,一般规则为artifactId-version[-classifier].packaging。

依赖包含的元素:
·groupId、artifactId和version:依赖的基本坐标,对于依赖,基本坐标是最重要的,Maven根据坐标找到需要的依赖。
·type:依赖的类型,对应项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar。
·scope:依赖的范围。
·optional:标记依赖是否可选。
·exclusions:排除传递性依赖。

依赖范围:
·compile:编译依赖范围。默认依赖,对于编译、测试、运行三种classpath都有效。
·test:测试依赖范围。只对测试classpath有效。
·provided:已提供依赖范围。对编译和测试classpath有效,但在运行时无效。
·runtime:运行时依赖范围。对测试和运行classpath有效,但在编译主代码时无效。
·system:系统依赖范围。和provided依赖范围完全一致。但使用system时必须通过systemPath元素显式指定依赖文件路径。
·import(Maven2.0.9及以上):导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。


传递性依赖机制:
Maven解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前项目中。
依赖范围影响传递性依赖:
最左列表示第一依赖范围,最上行表示第二依赖范围


Maven依赖调解(Dependency Mediation)原则:
第一原则是:路径最近者优先。
依赖关系:A->B->C->X(1.0)、A->D->X(2.0),中X(1.0)路径长度为3,X(2.0)路径长度为2,故X(2.0)被解析使用。
第二原则:第一声明者优先。
在依赖路径长度相等的前提下,POM中依赖声明顺序最靠前的依赖被解析使用。

排除依赖:
使用exclusions元素声明排除依赖,exclusions可包含多个exclusion子元素,可排除多个传递性依赖。
注,声明exclusion只需要groupId和artifactId,不需要version。

归类依赖:
首先使用properties元素定义Maven属性,该例中定义一个springframework.version子元素,其值为2.5.6。
有了这个属性定义后,Maven运行时会将POM中所有${springframework.version}替换成实际值2.5.6。
即,可使用美元符号和大括弧环绕的方式引用Maven属性,将所有SpringFramework依赖的版本值用这一属性引用表示。



查看当前项目的已解析依赖:mvn dependency:list
查看当前项目的依赖树:mvn dependency:tree
帮助分析当前项目依赖:mvn dependency:analyze
其中,Used undeclared dependencies,指项目中使用到但未显式声明的依赖,Unused declaredde pendencies,指项目中未使用但显式声明的依赖。

仓库路径与坐标的大致对应关系为groupId/artifactId/version/artifactId-version.packaging。

对于Maven,仓库只分两类:本地仓库和远程仓库。
中央仓库是Maven核心自带的远程仓库,它包含绝大部分开源构件。
私服是一种特殊远程仓库,为节省带宽和时间,应在局域网内架设一个私有的仓库服务器,用其代理所有外部远程仓库。内部项目还能部署到私服供其他项目使用。


设置localRepository元素的值为想要的仓库地址


Maven安装文件自带中央仓库的配置,在$M2_HOME/lib/maven-model-builder-3.0.jar(Maven2中,文件路径类似于$M2_HOME/lib/maven-2.2.1-uber.jar)org/apache/maven/model/pom-4.0.0.xml,可看到如下配置:

snapshots子元素enabled值为false,表示不从该中央仓库下载快照版本构件。

Maven下载构件:
先从私服请求
如果私服不存在该构件,则从外部远程仓库下载
缓存到私服后,再为Maven下载请求提供服务
此外,无法从外部仓库下载的构件可从本地上传到私服供大家使用


远程仓库配置:



Maven中央仓库使用id为central,若其他仓库声明使用该id会覆盖中央仓库配置。
releases和snapshots元素用来控制Maven对于发布版构件和快照版构件的下载。
releases的enabled值为true,表示开启JBoss仓库的发布版本下载支持。
snapshots的enabled值为false,表示关闭JBoss仓库的快照版本的下载支持。
updatePolicy用来配置Maven从远程仓库检查更新的频率,默认值是daily,每天检查一次。其他可用值:never,从不检查更新;always,每次构建都检查更新;interval,X—每隔X分钟检查一次更新(X为任意整数)。
checksumPolicy用来配置Maven检查检验和文件的策略。默认值是warn,执行构建时输出警告信息,其他可用值:fail,遇到校验和错误让构建失败;ignore,完全忽略校验和错误。

远程仓库认证:
settings.xml文件


部署至远程仓库:

distributionManagement包含repository和snapshotRepository子元素,前者表示发布版本构件的仓库,后者表示快照版本的仓库。
运行mvn clean deploy,Maven会将项目构建输出的构件部署到配置对应的远程仓库,如果项目当前的版本是快照版本,则部署到快照版本仓库地址,否则就部署到发布版本仓库地址。

依赖解析机制概括如下:
1)依赖范围是system时,Maven直接从本地文件系统解析构件。
2)根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,若发现相应构件,则解析成功,否则3)。
3)若依赖版本是显式的发布版本构件,如1.2、2.1-beta-1等,则遍历所有远程仓库,发现后下载并解析使用,否则4)。
4)若依赖版本是RELEASE或者LATEST,则基于更新策略读取所有远程仓库元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库对应元数据合并后,计算出RELEASE或者LATEST真实值,然后基于该值检查本地和远程仓库,如步骤2)和3),否则5。
5)若依赖版本是SNAPSHOT,则基于更新策略读取所有远程仓库元数据groupId/artifactId/version/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本值,然后基于该值检查本地仓库,或从远程仓库下载。
6)若最后解析得到的构件版本是时间戳格式快照,如1.4.1-20091104.121450-121,则复制其时间戳格式文件至非时间戳格式,如SNAPSHOT,并使用该非时间戳格式构件。

仓库镜像:

<mirrorOf>值为central,表示该配置为中央仓库镜像,任何对于中央仓库的请求都会转至该镜像,用户也可使用同样方法配置其他仓库镜像。
·<mirrorOf>*</mirrorOf>:匹配所有远程仓库。
·<mirrorOf>external:*</mirrorOf>:匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。即,匹配所有不在本机上的远程仓库。
·<mirrorOf>repo1,repo2</mirrorOf>:匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。
·<mirrorOf>*,!repo1</mirrorOf>:匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。
注,由于镜像仓库完全屏蔽被镜像仓库,当镜像仓库不稳定或者停止服务时,Maven仍无法访问被镜像仓库,因而将无法下载构件。

公共Maven仓库搜索服务:
SonatypeNexus,当前最流行的开源Maven仓库管理软件,地址:http://repository.sonatype.org/Nexus
Jarvana,支持浏览构件内部内容,提供便捷Java文档浏览功能,地址:http://www.jarvana.com/jarvana
MVNbrowser,能告诉用户该构件依赖哪些构件(Dependencies)及被哪些构件依赖(Referenced By),地址:http://www.mvnbrowser.com
MVNrepository,提供简单图表显示构件各版本间大小变化,地址:http://mvnrepository.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值