Maven必须掌握的核心概念

目录

一.认识pom.xml

二.依赖

三.仓库

四.生命周期


一.认识pom.xml

首先看一个创建maven项目生成的pom.xml文案

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.baidu</groupId>
	<artifactId>springboottest</artifactId>
	<version>0.0.1-SNAPSHOT</version>
        <packaging>war</packaging>
        <dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
                <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
       </dependencies> 

</project>

第一行xml头,介绍了xml文档的版本和编码的方式,第二行介绍了根元素project以及命名空间和xsd元素,这些对于应用来说没有啥用.但都是必须的.

根元素下第一个元素modelVersion指定了当前pom模型的版本,一般都是4.0不用管它.

接下来的三个是项目的基本坐标,是最最重要的属性了:

groupId:组别,定义了项目属于哪个组或者公司,一般都是公司的域名反写,因为域名是唯一的.

artifactId:属性,定义的是一个maven项目名,一个公司有很多项目,每个项目由很多的maven组成的.

version:版本号,因为项目要更新迭代,就要有一个版本号来定义,版本号要注意有我们例子上的RELEASE版本,代表了稳定的发布版本,也有SNAPSHOT快照版本,这个概念一定要区分开,一个项目如果版本是快照版本,说明项目还在开发的阶段,也就是说代码是变化的,当maven更新库的时候,会将version为快照版本的依赖进行重新下载,将最新的代码更新到我们的项目中.

这三个属性就像是三维中的坐标一样,可以定位到你要用的maven包.

packaging:定义了maven项目的打包方式,打包方式一般是jar包或者war包,如果是web工程就打war,不是就打jar,还有一种是pom,如果打了pom包,就生成了parent项目,他可以管理所有的子项目,负责定义子项目的公共属性,例如项目版本,共同依赖的jar包等,他就一个项目的集合,本是并不会打成jar包,实现功能.举个简单的例子,这个parent项目就相当于抽象类,对类的公共的属性做了定义,继承后就可以使用它的属性了.

另外pom包主要是两个功能:聚合和继承,聚合是将所有的项目聚集到一起,继承是可以将公共的依赖做定义.聚合的目的是为了快速的构建项目,一个命令只要在parent项目执行一次就好不用分别去子项目执行,继承是为了消除重复的配置.

二.依赖

标签<dependencies></dependencies>就声明了各种依赖,除了坐标三元素外,还要type依赖的类型,默认为jar,scope依赖的范围,option标记依赖是否可选,exclusions排除传递性依赖.

先从scope依赖范围讲起:

compile:编译依赖范围.没有指定的都默认为此范围,低于编译,测试,运行三种都有效.

test:测试依赖范围,只对测试有效.仅仅实在测试的时候需要的依赖.

provide:已提供的依赖范围,只在编译和测试的时候有效,一般是依赖的环境,例如容器,当运行项目的时候,由于运行环境中已经提供了,就不需要maven重复的引入了.

runtime:运行时的依赖范围,对于测试和运行时候有效,编译代码的时候无效.泪如JDBC驱动.

system:系统依赖范围,和provide的原理类似,不是很常见.

讲完了依赖,就要说说各个依赖之间的关系了,当C依赖了B,B依赖了A,A,C就间接的产生了关系,叫做依赖的传递,但是他们之间的依赖关系不仅仅是一种,这就涉及到了传递性依赖.这个老生常谈,不在赘述.

当依赖有冲突的时候,记得两大原则:就近原则和第一生命原则.

option标记依赖:当我们不想让依赖有传递关系的时候就将option设置为true.

exclusions排除依赖:maven会隐士的引入好多依赖,当我们不想引入某些依赖时(例如快照版本),就用此标签标记.

三.仓库

仓库分为中央远程仓库和本地仓库,依赖的jar包优先从本地仓库下载,这个没什么好说的,值得一说的是私服.

私服是特殊的远程仓库,一般企业会布置一个,这样方便管理全公司的jar包,也可以将本公司的jar包发布到私服上供大家使用,有的时候,你发现在公司好好的maven,回到家里就不好使了,就是因为maven在配置镜像的时候配置了私服的,私服一般不允许外网访问,所以老是出现jar下载失败的情况.

正式由于公司将项目放到了私服上,所以当好几个项目同时开发而且有依赖的时候,同事会让你把最新的代码发布一下,其实就是发布到了私服上面,然后maven强制的更新的时候,由于开发的是快照版本,会重新下载jar包,就会将最新的jar下载到他的项目里.常用的发布命令是mvn clean deploy.

四.生命周期

可以简单的理解为什么时候干什么事.不同的生命周期功能不同,实际都是由插件来完成.

三套生命周期:clean 生命周期,最主要的功能是清理上一次构建的文件.default生命周期:最最核心的生命周期,大部分功能都在这个周期实现例如compile编译,test测试,package打包,install安装,deploy发布.site生命周期:建立和发布项目的站点,不怎么接触到.

命令行和生命周期的关系,mvn test 执行了default的所有的阶段,mvn clean install 调用了clean生命周期和default生命周期,实际执行的是clean周期的pre-clean 和clean阶段,以及default的所有的阶段.

只要下达了命令,对应的插件就会执行相应的功能(插件目标),我们会在控制台上看到好多日志,主要描述的是哪些插件工作了,都干了哪些活.不用刻意的去记住,只要了解就好.

最后,maven为了不让项目出现混乱,他的规则是约定优于配置.

菜鸟一个,老是被老鸟嘲笑,什么还不懂,还不去学,所以买了一本maven实战看了看,有一些收获,看过之后觉得也没什么,结合工作,觉得这些理解了也就够用了,至于更深的可以看看其他大神的.---------------永远保持奋斗,永远热泪盈眶.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值