这篇文章对Maven中几个比较重要的概念坐标、依赖、仓库、生命周期做一个简单的介绍。

1、关于Maven坐标

用来区别Maven世界中任何一个构件,Maven坐标的元素包括groupId、artifactId、version、packaging、classifier,只要我们提供正确的坐标就能够访问对应的构件。

<groupId>org.springframework</groupId>   //当前Maven项目隶属的实际项目,其下面可能按功能划分了很多子项目,spring-core、spring-context等
<artifactId>spring-core</artifactId>  //当前项目名
<version>4.2.2.RELEASE</version>    //项目版本
<packaging>jar</packaging>        //Maven项目的打包方式

2、关于依赖

依赖应该是pom.xml文件中最常用到的东西了,用于把第三方的构件引入当前项目中。

 <project>
...
<dependencies>
<dependency>
<groupId>org.srpingframework</groupId>
<artifactId>spring-core</artifactId>
<version>1.0</version>  //以上这三个标签确定依赖的坐标以便寻找构件
<scope>compile</scope>  //依赖的范围
<optional>true</optional> //标记依赖是否可选
<exclusions>        //排除传递性依赖
<exclusion>
...
</exclusion>
<exclusions>
</dependency>
</dependencies>
</project>

依赖的范围:用来控制引入的依赖构件与三种classpath的关系(编译、测试、运行),其中分为五种类型

compile: 编译依赖范围,对于编译、测试、运行都有效,在这三种情况下都需要该依赖的时候使用该依赖,spring-core。

test: 测试依赖范围,该依赖只在测试时有效,编译主代码或运行时该依赖无效,最常见的例子是junit。

provided: 已提供依赖范围,编译测试有效,运行无效,典型的例子servlet-api,因为运行的时候tomcat容器已经提供了servlet-api,所以不再需要重复提供。

runtime: 运行时依赖,测试运行有效

system: 系统依赖范围,于classpath的关系和provided完全一致,但是依赖不是来自于Maven,而是从本地引入,一般不推荐使用。

import:

传递性依赖:A-->B-->C,A依赖B,B依赖C,那么由于B的中间依赖作用A也会依赖C。

依赖的调节:当我们同时引入了两个或以上的相同依赖时无疑会出现问题,所以Maven根据以下这两个法则来确定引入那个版本的依赖

  最短路劲依赖:A-->B-->C-->X(1),A-->D-->X(2),这种情况下会引入X(2)而舍弃X(1)依赖。

  当依赖路劲相等的情况下,根据依赖出现的先后位置来确定引入何种依赖,顺序靠前的优先解析。

可选依赖: 比如说项目A依赖项目B,而B依赖X或者Y,B是持久层隔离工具包,支持多种数据库,依赖mysql或者oracle等,构建项目时需要他们的驱动程序,但是使用的时候只能依赖其中一种,这个时候就需要可选依赖了。可选依赖不会传递,也就是说X或者Y不会对A造成任何影响。

排除依赖:当我们需要排除这个依赖而引入另一个依赖时使用,例如Sun JTA API,Hibernate依赖这个jar,但是由于版权原因,该类库不存在于中央仓库中,而Apache中有一个对应的实现,这个时候就可以排除掉sun的这个依赖而引入apache的对应依赖。

  <exclusions>声明要排除依赖的groupId artifactId 这里不需要version因为maven的pom文件里不能存在groupId artifactId相同而
version不同的依赖,所以只需要groupId artifactId就可以确定要排除的依赖

归类依赖: 

  假设在一个项目中有很多关于Spring Framework的依赖 org.springframework:spring-core:2.5.6 、org.springframework:spring-bean:2.5.6、
 org.springframework:spring-context:2.5.6,他们都是来自一个项目的不同模块,假设我们要对Srping Framework进行升级,最好把version提取出来,
方便统一修改,类似于java中关于常量的作用,这里要用到<properties>。

<properties>
<springframework.version>2.5.6</springframework.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies>

3.仓库

分类:a、远程仓库  b、本地仓库(b1:中央仓库,b2:私服又称局域网,b3:其他公共仓库)

当maven根据坐标寻找构件的时候,首先查看本地仓库,如果存在此构件就直接使用,不存在就会去远程仓库寻找然后下载到本地仓库。

<project>
...
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases> //是否允许下载发布版构件
<enabled>true</enabled>
</releases>
</repository>
<snapshots> //是否允许下载快照版构件
<enabled>false</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
<layout>default</layout>
</repositories>
...
</project>

快照版本:A B项目同时进行开发,B项目依赖A项目,当A项目有变动时就可以发布个快照版本供B项目使用其最新的功能,maven会自动从仓库中检查A的最新快照。

镜像:如果仓库X能提供仓库Y存储的所有内容,那么就可以认为仓库X是Y的一个镜像。常结合私服一起使用。

<mirrors>
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
</mirrors>

4、生命周期

maven分为三种生命周期,分别是clean、default、site
clean:清理项目
default:构建项目
site:建立项目站点
每种生命周期都包含一些阶段,后面的阶段依赖前面的阶段,如果执行一个生命周期中的某一阶段,那么这一阶段前面的阶段都会执行。
default阶段包含以下阶段
validate
initialize
...
process-sources:处理项目资源文件src/main/resources
compile:编译项目主代码
...
test:测试代码
...
package
...
install
deploy:将项目复制到远程仓库 ,供其他开发人员和maven项目使用
这下应该清楚了为什么执行mvn test命令后项目的主代码也编译了。

从命令行执行maven任务实际上就是调用maven的生命周期阶段,各生命周期之间是相互独立的。
mvn clean install: 该命令调用clean周期的clean阶段和default周期的install阶段,这同一生命周期内两个阶段之前的阶段都会执行。

构件工具Maven----坐标、依赖、仓库、生命周期的简单学习的更多相关文章

  1. maven详解之生命周期与插件

    Maven是一个优秀的项目管理工具,它能够帮你管理编译.报告.文档等. Maven的生命周期: maven的生命周期是抽象的,它本身并不做任何的工作.实际的工作都交由"插件"来完成 ...

  2. 着重基础之—构建工具—Maven的依赖管理

    着重基础之—构建工具—Maven的依赖管理 项目构建利器Maven给我们开发人员带来了极大的便利,从繁琐的jar包管理中脱身的程序员终于可以有时间再进入另一个坑了. 我今天要给大家分享的内容是我在实际 ...

  3. (二)Maven 基本概念——依赖、生命周期、仓库管理、聚合&继承

    1. 依赖配置 1.1 依赖配置主要包含如下元素: <!--添加依赖配置--> <dependencies> <!--项目要使用到junit的jar包,所以在这里添加ju ...

  4. Maven实战读书笔记(二):Maven坐标与仓库

    2.1 Maven坐标 Maven坐标是Maven用来表示一个组件依赖的标示. Maven通过下面几个元素定义坐标:groupId.artifactId.version.packaging.class ...

  5. Maven 的插件和生命周期的绑定

    一.Maven 的生命周期 Maven 的生命周期是对所有的构建过程进行抽象和统一.Maven 的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,生命周期只是定义了一系列的阶段,并确定这些阶 ...

  6. maven的核心概念——生命周期

    第十一章生命周期 11.1 什么是Maven的生命周期 ●Maven生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven就可以自动化的执行构建命令了. ●Maven有三套相互独立的生命周期, ...

  7. java EE技术体系——CLF平台API开发注意事项(4)——API生命周期治理简单说明

    文档说明 截止日期:20170905,作者:何红霞,联系方式:QQ1028335395.邮箱:hehongxia626@163.com 综述 有幸加入到javaEE技术体系的研究与开发,也得益于大家的 ...

  8. Unity3D笔记八 Unity生命周期及动画学习

    Unity脚本从唤醒到销毁有着一套比较完善的生命周期,添加任何脚本都必须遵守自身生命周期法则.下面介绍一下生命周期中由系统自身调用的几个比较重要的方法.  Update(){}.正常更新,用于更新逻 ...

  9. vue笔记 - 生命周期第二次学习与理解

    对于刚接触vue一两个月.才仅仅独立做过一两个vue项目的小白来说,以前一直自我感觉自己知道vue的生命周期, 直到前两天去面试,面试官让我说一下vue的生命周期... 其实我的心中是有那张图的,但是 ...

随机推荐

  1. data-属性

    html5中出现data标签,该标签可以为div,p,span,td等各种标签提供属性 <div id="button" data-mm='{"name" ...

  2. ZOJ 3861 - Valid Pattern Lock

    3861 - Valid Pattern Lock Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & ...

  3. JSch - Java实现的SFTP(文件上传详解篇) [转载]

    文章来源:http://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html JSch是Java Secure Channel的缩写.JSch是 ...

  4. 在opencv中实现中文输出

    http://pan.baidu.com/s/1hrQTWDe 已经成功 ; 来自为知笔记(Wiz)

  5. java 导入自定义类

    eclipse导入很容易,昨天上课学了一下用记事本写java,导入自定义类,这就麻烦了. 代码贴一下,方便操作: package tom.jiafei; public class SquareEqua ...

  6. Servlet基础简单总结(上)

    Servlet基础一些简单总结(上): 1.Java Servlet是运行在Web服务器上的Java程序2.Java平台给Servlet开发者提供了强大的API/面向对象编程平台无关/强类型/垃圾回收 ...

  7. jquery的ajax向ashx传值,中文乱码问题

    从网上查找了很多资料: 有在配置文件里面加如下配置 <globalization responseEncoding="utf-8" requestEncoding=" ...

  8. git总结

    1.先画个图,先对git的操作有个直观了解 2.分析下git中文件是怎么存储的 正如下面所示git存储不是每次更改就会产生一个新的文件,而是产生一个版本,这个版本对应着记录每个文件的不同情况 具体的存 ...

  9. Mysql-学习笔记(==》权限管理 十 三)

    -- 用户与权限管理-- 查看当前服务器上的所有账号密码主机SELECT USER,PASSWORD,HOST FROM mysql.user; -- 设置账号密码SET PASSWORD=PASSW ...

  10. 2016年10月26日 星期三 --出埃及记 Exodus 19:10-11

    2016年10月26日 星期三 --出埃及记 Exodus 19:10-11 And the LORD said to Moses, "Go to the people and consec ...