Maven的作用
- 项目构建:提供标准的,跨平台的自动化项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
- 统一开发结构:提供标准的、统一的项目结构
Maven仓库
- 仓库用于存储资源,包含各种各样的jar包
- 仓库分类:
- 本地仓库:自己电脑上存储资源的仓库,远程连接仓库获取资源
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
- 中央仓库:Maven团队维护,存储所有资源的仓库
- 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
- 私服的作用
- 保存具有版权的资源,包含购买或自主研发的jar包
- 中央仓库中的jar包都是开源的,不能存储具有版权的资源
- 一定范围内共享资源,仅对内部开放,不对外共享
Maven坐标
- 坐标组成
- groupId:定义当前Maven项目隶属组织名称
- artifactId:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)
- version:定义当前项目版本号
- packaging:定义该项目的打包方式
- Maven坐标的作用
- 使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交给机器完成
Maven项目的构建命令
mvn compile #编译 mvn clean #清理 mvn test #测试 mvn package #打包 mvn install #安装到本地仓库
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 http://maven.apache.org/maven-v4_0_0.xsd"> <!--指定pom的模型版本--> <modelVersion>4.0.0</modelVersion> <!-- 打包方式,web工程打包为war,Java工程打包为jar--> <packaging>war</packaging> <name>maven_01</name> <!-- 组织id--> <groupId>com.maven_01</groupId> <!-- 项目id--> <artifactId>maven_01</artifactId> <!-- 版本号--> <version>1.0-SNAPSHOT</version> <!--设置当前工程的所有依赖d--> <dependencies> <!-- 当前依赖--> <dependency> <!-- 依赖所属群组id--> <groupId>junit</groupId> <!-- 依赖所属项目id--> <artifactId>junit</artifactId> <!--依赖版本号--> <version>4.13.2</version> <scope>test</scope> </dependency> </dependencies> <!--构建--> <build> <!-- 设置插件--> <plugins> <!-- 具体的插件配置--> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>8080</port> <path>/</path> </configuration> </plugin> </plugins> </build> </project>
依赖管理
- 依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源(禁止套娃 (—_—!))
依赖传递的冲突问题 :自己的直接依赖与间接依赖里面存在相同的依赖时候用谁的依赖版本?(路径优先)如果两个间接依赖中(同级)有两个相同的依赖(同级)那么又用谁呢?(声明优先)
- 层级划分:直接依赖为1级,直接依赖的依赖为2级,依次往后类推
- 路径优先:当依赖中出现相同的资源时,层级越深(级别数越大),优先级越低,层级越浅,优先级越高
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的(父级依赖的配置在
pom.xml
文件位置) - 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖优先配置的
- 可选依赖
- 可选依赖指对外隐藏当前所依赖的资源——不透明(<optional>true</optional>)
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <optional>true</optional> </dependency>
- 排除依赖
- 排除依赖指主动断开依赖资源,被排除的资源无需指定版本——不需要
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version>//排斥junit依赖下的org.hamcrest依赖 <exclusions> <exclusion> <groupId>org.hamcrest</groupId> <artifactId>hamcrest</artifactId> </exclusion> </exclusions> </dependency>
- 小结
- 可选依赖是依赖资源还存在还可以用只是看不见了,而排除依赖是直接不连接依赖资源了该依赖不可用了
- 依赖范围
- 依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
- 作用范围
- 主程序范围有效(main文件夹范围)
- 测试程序范围有效(test文件夹范围)
- 是否参与打包(package指令范围内)
- scope主代码测试代码打包范例compile(默认)YYYlog4jtestYjunitprovidedYYservlet-apiruntimeYjdbc
- 依赖范围的传递性
- 带有依赖范围的资源在进行传递时,作用范围将受到影响
- 间接依赖\直接依赖compiletestprovidedruntimecompilecompiletestprovidedruntimetestprovidedruntimeruntimetestprovidedruntime
生命周期与插件
- Maven构建生命周期描述的是一次构建过程经历了多少个事件
compile test-compile test package install
- Maven对项目构建的生命周期划分为3套
- clean:清理工作
- default:核心工作,例如编译,打包,部署等
- site:产生报告,发布站点等
- 插件
- 插件与生命周期内的阶段绑定,在执行到对应的生命周期时执行对应的插件
- 默认maven在各个生命周期上绑定有预设的功能
- 通过插件可以定义其他的功能。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <goals> <goal>jar</goal> </goals> <phase>generate-test-resources</phase> </execution> </executions> </plugin>
快速创建maven项目