目录
什么是maven
Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。
Maven是Apache下的一个开源项目,它是一个项目管理工具,它用于对java项目进行项目构建、依赖管理及项目信息管理。
概念模型
maven包含了一个项目对象模型(Project Object Mobel)、
一组标准集合、
一个项目生命周期(Project Lifecycle)、
一个依赖管理系统(Dependency Management System)
以及用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
项目对象模型pom (Project Object Model)
其是 Maven 工程的基本工作单元,是一个XML文件,通过pom.xml定义项目的坐标、项目依赖、项目信息、插件目标等。
依赖管理系统(Dependency Management System)
通过定义项目所依赖组件的坐标由maven进行依赖管理。(在pom.xml中配置)
项目生命周期(Project Lifecycle)
阶段 | 处理 | 描述 |
---|---|---|
验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的 |
编译 compile | 执行编译 | 源代码编译在此阶段完成 |
测试 Test | 测试 | 使用适当的单元测试框架(例如JUnit)运行测试。 |
包装 package | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包 |
检查 verify | 检查 | 对集成测试的结果进行检查,以保证质量达标 |
安装 install | 安装 | 安装打包的项目到本地仓库,以供其他项目使用 |
部署 deploy | 部署 | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 |
一组标椎集合
比如,标椎的目录结构,标椎的生命周期,依赖管理有标准的坐标定义等。
插件目标
maven整个生命周期过程都是基于插件完成的。
eg
理想的项目构建:高度自动化,跨平台,可重用的组件,标准化的
什么是依赖?为什么要进行依赖管理:自动下载,统一依赖管理
项目信息:项目名称描述等,开发人员信息,开发者信息等
maven安装目录
-
bin目录 含有mvn运行的脚本
mvn.bat (以run方式运行项目)、 mvnDebug.bat(以debug方式运行项目 )
-
boot目录 含有maven运行需要类加载器
-
conf目录 settings.xml 整个maven工具核心配置文件
-
lib目录 maven运行依赖jar包
maven约定的目录结构
–src/main/java —— 存放项目的.java文件
–src/main/resources ——存放项目资源文件
–src/test/java ——存放所有测试.java文件
–src/test/resources ——测试资源文件
–target —— 项目输出位置
–pom.xml
maven坐标
Maven为什么使用坐标?
Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范,拥有了统一规范,就可以把查找工作交给机器
坐标含义
groupId | 定义当前Maven项目隶属项目 |
---|---|
artifactId | 定义实际项目中的一个模块 |
version | 定义当前项目的当前版本 |
packaging | 定义该项目的打包方式 |
classifier | 帮助定义构建输出 |
前四个标识决定了Maven 的唯一性
依赖管理
依赖范围(scope) | 描述 | 对于主代码classpath有效 | 对于测试代码classpath有效 | 被打包,对于运行时classpath有效 | 例子 |
---|---|---|---|---|---|
compile | 默认编译依赖范围 | √ | √ | √ | log4j |
test | 测试依赖范围 | - | √ | - | junit |
provided | 已提供依赖范围 | √ | √ | - | servlet-api |
runtime | 运行时提供 | - | - | √ | JDBC |
传递性依赖和可选依赖
a.路径最近者优先
b.路径相同,第一声明者优先
仓库管理
何为Maven仓库?
用来统一存储所有Maven共享构建的位置就是仓库
仓库分类
本地仓库
默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/repository/ 的仓库目录。
Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>C:/MyLocalRepository</localRepository> </settings
远程仓库
中央仓库:Maven默认的远程仓库
–http://repo1.maven.org/maven2
私服:是一种特殊的远程仓库,它是架设在局域网内的仓库
私服类似于缓存,减轻带宽
镜像:用来替代中央仓库,速度一般比中央仓库快
生命周期
何为生命周期?
Maven生命周期就是为了对所有的构建过程进行抽象和统一
包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤
三个标准的生命周期:
-
clean:项目清理的处理
-
pre-clean:执行一些需要在clean之前完成的工作
-
clean:移除所有上一次构建生成的文件
-
post-clean:执行一些需要在clean之后立刻完成的工作
-
-
default(或 build):项目部署的处理(构建项目的)
validate(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 initialize(初始化) 初始化构建状态,比如设置属性值。 compile(编译) 编译项目的源代码。 test-compile(编译测试源码) 编译测试源代码到测试目标目录. test(测试) 使用合适的单元测试框架运行测试(Juint是其中之一)。 package(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 verify (验证) 运行任意的检查来验证项目包有效且达到质量标准。 install(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 deploy(部署) 将最终的项目包复制到远程仓库中与其他开发者和项目共享。 -
site:项目站点文档创建的处理(生成项目站点的)
-
pre-site:执行一些需要在生成站点文档之前完成的工作
-
site:生成项目的站点文档
-
post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
-
site-deploy:将生成的站点文档部署到特定的服务器上
-
Maven插件
compile 的具体操作是由 maven-compile-plugin 来实现的。
mvn compile或者全写 mvn compiler :compile
所以说 Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。
继承
继承目的
为了消除重复,把相同的配置提取出来
步骤
-
父项目的打包方式修改为 pom
<groupId>com.ictpaas</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging>
-
父项目使用 dependencyManagement 标签来管理, 表示子项目默认不继承,
用dependencies定义的依赖,子项目可继承
-
子项目配置父项目
<parent> <!-- 父项目坐标 --> <artifactId>parent</artifactId> <groupId>com.ictpaas</groupId> <version>1.0-SNAPSHOT</version> <!-- 父项目 pom 文件路径--> <relativePath>../parent/pom.xml</relativePath> </parent>
-
子项目依赖配置
<dependencies> <!-- 不需要版本, 会从父项目继承, 如果指定版本就是代表不是来自父 pom 而是子 pom 自己的. --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dependency> </dependencies>
-
子项目不仅仅继承依赖, url, name, modeVersion等也能继承, 换句话说子 pom 文件内容看起来很简洁,便于管理
聚合
聚合的主要作用
一次构建多个项目模块
私服
Nexus内置仓库说明:
-
Maven Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
-
Releases:这是一种策略为Release的宿主类型仓库,用来部署组织内部的发布版本构件。
-
Snapshots:这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件
-
3rd party:这是一个策略为Release的宿主类型仓库,用来部署无法从公共仓库获得的第三方发布版本构件。
-
Public Repositories:该仓库组将上述所有策略为Release的仓库,聚合并通过一致的地址提供服务。