Maven实战笔记

第五章 坐标和依赖
一组 maven 坐标是通过一组元素定义的:groupId, artifactId, version, packaging, classifier。这是nexus-indexer的坐标定义,nexus-indexer是一个对maven仓库编纂索引并提供搜索功能的类库,是Nexus项目的一个子模块。
groupId:定义当前maven项目隶属的实际项目。
artifactId:该元素定义实际项目中的一个maven项目,推荐做法是使用实际项目名称作为artifactId的前缀。
version:版本号
任何一个maven项目都需要定义自己的坐标,当这个maven项目成为其他maven项目依赖的时候,这组坐标就体现了其价值。
pom.xml中scope元素用来定义依赖范围。当依赖范围为test的时候,该依赖只会被加入到测试代码的classpath中。即,对于项目主代码,该依赖是没有任何作用的。
依赖范围是用来控制依赖与三种classpath(编译classpath,测试classpath,运行classpath)的关系,Maven有以下几种依赖范围:compile,test,provided(编译,测试有效,运行无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行时,由于容器已经提供,就不需要maven重复地引入),runtime(测试和运行时有效,编译时无效),system(谨慎使用),import(导入依赖范围,不会对三种classpath产生实际的影响)


传递性依赖:假设A依赖于B,B依赖于C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。当第二依赖是compile时传递依赖范围取决于第一依赖范围。


依赖调解。例如项目A有这样的依赖关系:A-》B-》C-》X(1.0),A-》D-》X(2.0),X是A的传递性依赖,但是两条路径上有两个版本的X,那么哪个会被maven解析呢?maven依赖调解的第一原则是:路径最近者优先。该例中X(1.0)的路径长度为3,而X(2.0)的路径长度是2,因此X(2.0)会被解析。依赖调解第二原则是:第一声明者优先。在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用,顺序靠前的那个依赖优先。
可选依赖。假如有这样的依赖关系,项目A依赖于项目B,项目B依赖于项目X和Y,B对于X和Y的依赖都是可选依赖:A-》B,B-》X(可选),B-》Y(可选)。根据传递性依赖的定义,如果所有这三个依赖范围都是compile,那么X,Y就是A的compile范围传递性依赖。然而,由于这里X,Y是可选依赖,依赖将不会传递,即,X,Y将不会对A有任何影响。可选依赖在数据库连接器依赖中有使用。
排除依赖。


已解析依赖,查看当前项目的已解析依赖:mvn dependency:list,查看当前项目依赖树:mvn dependency:tree,分析当前项目依赖:mvn dependency:analyze。

第 6 章 仓库
仓库分类。对maven来说,只分为本地仓库和远程仓库。当maven根据坐标寻找构件时,本地仓库不存在,会从远程仓库下载到本地仓库使用。如果本地仓库和远程仓库都没有需要的构件,maven会报错。
中央仓库是maven核心自带的远程仓库,maven自带的中央仓库使用的id为central。
私服是一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。
私服的优点:
    节省自己的外网带宽。
    加速maven构建。maven的一些内部机制要求maven在执行构建的时候不停地检查远程仓库数据。因此,当项目配置了很多外部远程仓库的时候,构建的速度会被大大降低。
    部署第三方构件。当某个构建无法从任何一个外部远程仓库获得,比如JDBC驱动,建立私服后,这个构件可以部署到这个内部仓库,供内部maven项目使用。
    提高稳定性,增强控制。
    降低中央仓库的负荷。
远程仓库的认证。配置认证信息和配置仓库信息不同,仓库信息可以直接配置在POM文件中,但是认证信息必须配置在settings.xml文件中。这是因为POM往往是被提交到代码仓库中供所有成员访问的,而settings.xml文件一般只能放在本机。因此,在settings.xml中配置认证信息更为安全。

部署至远程仓库。mvn clean deploy


快照版本便于平时开发。
镜像。如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。

第 7 章 生命周期和插件
除了坐标,依赖以及仓库外,maven另外两个核心概念是生命周期和插件。在有关maven的日常使用中,命令行输入往往就对应了生命周期。maven的生命周期是抽象的,其实际行为都由插件来完成,如package阶段的任务可能就会由maven-jar-plugin完成。
生命周期抽象了构建的各个步骤,定义了它们的次序,但没有提供具体实现。具体实现(构建任务)由绑定一个或者多个插件来实现。
三套生命周期,maven拥有三套相互独立的生命周期,它们分别为clean,default和site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site生命周期的目的是建立项目站点。三套生命周期本身是相互独立的。
插件目标,很多功能聚焦在一个插件里,每个功能就是一个插件目标。例如:dependency:analyze,冒号前边是插件前缀,冒号后边是该插件的目标。
插件绑定,maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言,是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。
自定义绑定插件。在POM的build元素下的plugins子元素中声明插件的使用。


在线插件信息。参考网上插件文档详细解释。
插件仓库。插件存储在maven仓库中,maven会区别对待依赖的远程仓库与插件的远程仓库。


插件的默认groupId。在POM中配置插件的时候,如果该插件是maven官方插件(即如果其groupId为org.apache.maven.plugins)就可以省略groupId配置。
超级POM是所有maven项目的父POM。

第 8 章 聚合与继承
对于聚合模块来说,其打包方式packaging的值必须为pom,否则就无法构建。
为了方便构建项目,通常将聚合模块放在项目目录的最顶层,其他模块则作为聚合模块的子目录存在。
maven提供了dependencyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下的依赖声明不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。
在parent项目pom.xml dependencyManagement元素下配置了依赖后,子项目中依赖配置只用配置groupId和artifactId,version和scope不用配置。
插件管理,maven提供了pluginManagement元素帮助管理插件。在该元素中配置的依赖不会造成实际的插件调用行为,当POM中配置了真正的plugin元素,并且其groupId和artifactId与pluginManagement中配置的插件匹配时,pluginManagement的配置才会影响实际的插件行为。
聚合与继承的关系,聚合是为了方便地构建项目,继承主要是为了消除重复配置。
约定优于配置,使用约定可以大量减少配置。XML流行的原因之一是所有语言都接受它。
超级POM。
反应堆,在一个多模块的maven项目中,反应堆是指所有模块组成的一个构建结构。对于单模块的项目,反应堆就是该模块本身,但对于多模块项目来说,反应堆就包含了各模块之间继承与依赖的关系,从而能够自动计算出合理的模块构建顺序。

第 9 章 使用 Nexus 创建私服
配置maven从nexus下载构件。在实际应用中,往往想要通过一次配置就能让本机所有的maven项目都使用自己的maven私服。这时可以在settings.xml文件中配置,但是settings.xml并不支持直接配置repositories和pluginRepositories。所幸maven还提供了Profile机制,能让用户将仓库配置放到settings.xml的Profile中。

maven web项目默认位置是 src/main/webapp

maven为了支持灵活构建,内置了三大特性,即属性,Profile和资源过滤。
内置属性,maven有两个常用内置属性:${basedir}表示项目根目录,即包含pom.xml文件的目录,${version}表示项目版本。
POM属性,用户可以使用该类属性引用POM文件中对应元素的值。如${project.groupId}
自定义属性
settings属性,与POM属性同理,用户用settings.开头的属性引用settings.xml文件中XML元素的值。
Java系统属性,所有Java系统属性都可以使用Maven属性引用,例如:${user.home}指向用户目录
环境变量属性,所有环境变量都可以使用以env.开头的Maven属性引用。
将maven中配置的属性引入普通属性文件(资源文件)。maven属性默认只有在POM中才会被解析。资源文件的处理其实是maven-resources-plugin做的事情,它默认的行为只是将项目主资源文件复制到主代码编译输出目录中,将测试资源文件复制到测试代码编译输出目录中。只要一些简单的POM配置,该插件就能解析资源文件中的maven属性,即开启资源过滤。


为了能够让构建在各个环境下方便地移植,maven引入了profile概念。用户可以使用很多种方式激活profile,以实现构建在不同环境下的移植。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值