目录
一、Maven简介
1) 跨平台的项目管理工具
Maven是一个项目构建工具、依赖管理工具、项目信息管理工具
- 项目构建:自动化构建过程,完成从清理、编译、测试到生成报告,再到打包和部署所有阶段
- 依赖管理:根据groupId、artifactId、version元素自动下载依赖的类库
- 项目信息管理:集中管理分散在项目各个角落的项目信息,包括项目描述、开发者列表、版本控制系统地址等等
2) 核心概念
Maven包括以下核心概念:
- 坐标: 唯一定位一个类库
- 依赖: 说明项目所需要的类库列表
- 仓库: 存储类库的地点
- 生命周期: 所有构建过程的抽象和统一,不做任何实际的工作
- 插件: 每个生命周期的阶段绑定一个或多个插件,完成实际的构建工作
二、POM元素介绍
1) POM元素
元素名称 | 说明 | 默认值 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
modelVersion | POM模型的版本 | 4.0.0 | ||||||||||||
groupId | 定义项目所属组 | |||||||||||||
artifactId | 定义项目在组中的唯一ID | |||||||||||||
version | 项目版本,分为发布版本和快照版本。以SNAPSHOT结尾的是快照版本 | |||||||||||||
packaging | 打包方式,可选值为jar、war、pom、maven-plugin、ejb、ear、rar | jar | ||||||||||||
classifier | 定义主构件的附属构件,不能直接定义 | |||||||||||||
name | 对于用户更为友好的名称,无其它意义 | |||||||||||||
dependencies | 依赖列表 | |||||||||||||
dependency | 定义一个依赖 | |||||||||||||
scope | 控制依赖与3中classpath(编译、测试、运行)的关系
| compile | ||||||||||||
type | 依赖的类型,对应依赖类库的packaging的值 | jar | ||||||||||||
optional | 标记依赖是否为可选依赖,可选依赖不会被传递,需要在子POM中重新指定 | false | ||||||||||||
exclusion | 排除依赖jar包中的部分类库 |
2) 生成项目骨架命令
使用mvn archetype:generate,并跟随提示输入groupId和artifactId(其余可以使用默认值,直接回车),可以生成完整的maven项目骨架。
3) 依赖分析命令
- mvn dependency:list : 以列表的形式展示所有的依赖(包括传递依赖)以及依赖范围
- mvn dependency:tree :以层级结构展示依赖树
- mvn dependency:analyze :分析项目的依赖,包括已使用但未显式声明依赖,已显式声明但未使用的依赖(显式声明:直接在POM文件中指定,而非通过其它依赖传递进来的)
- Used undeclared dependencies:已使用但未显式声明依赖,通过直接依赖传递进来的。可能由于直接依赖升级,相关传递性依赖的版本同步变更,导致与当前项目不兼容
- Unused declared dependencies:已显式声明但未使用依赖,但只会分析编译主代码和测试代码阶段用到的依赖,仅执行阶段使用到的依赖会被作为未使用依赖,因此不能简单地直接删除声明
三、Maven仓库配置
1) 仓库类型
- 本地仓库:本地存储依赖文件的目录
- 远程仓库:分为3类
- 中央仓库:超级POM中默认配置的远程仓库(地址:http://repo.maven.apache.org/maven2/)
- 私服:局域网内的远程仓库,减少从中央仓库或其它公共库下载的耗时
- 其它公共库
2) settings.xml文件配置
- 设置本地仓库
<localRepository>${localpath}</localRepository>
- 设置远程仓库:远程仓库包括依赖仓库以及插件仓库,需要分开配置
<!-- 由于settings.xml文件中无法直接设置repositories、pluginRepositories元素,因此需要嵌套在profiles中 --> <profiles> </profiles> <id>remote-repository</id> <!-- 默认激活当前profile。支持多个profile,仅激活其中一部分(不激活则无效) --> <activation> <activeByDefault>true</activeByDefault> </activation> <!-- 下载依赖的远程仓库 --> <repositories> <!-- 发布版本的仓库设置 --> <repository> <id>releases</id> <name>依赖发布版本的仓库</name> <url>${release_url}</url> <!-- 快照版本配置 --> <snapshots> <enabled>false</enabled> <!-- 不支持快照版本下载 --> </snapshots> <!-- 发布版本配置 --> <releases> <enabled>true</enabled> <!-- 支持发布版本下载 --> <updatePolicy>daily</updatePolicy> <!-- 检查更新的频率,默认为daily。可选值有daily-每天检查一次,never-从不检查,always-每次构建都检查,interval:X-每隔X分钟检查一次 --> <checksumPolicy>warn</checksumPolicy> <!-- 配置校验和失败的策略,默认为warn。可选之有warn-执行构建时输出警告信息,fail-直接让构建失败,ignore-完全忽略 --> </releases> </repository> <!-- 快照版本的仓库设置 --> <repository> <id>snapshots</id> <name>依赖快照版本的仓库</name> <url>${snapshot-url}</url> <snapshots> <enabled>true</enabled> <updatePolicy>daily</updatePolicy> </snapshots> <releases> <enabled>false</enabled> </releases> </repository> </repositories> <!-- 下载插件的远程仓库 --> <pluginRepositories> <pluginRepository> <id>releases</id> <name>插件发布版本的仓库</name> <url>${plugin_release_url}</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </pluginRepository> <pluginRepository> <id>snapshots</id> <name>插件快照版本的仓库</name> <url>${plugin_snapshot-url}</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>false</enabled> </releases> </pluginRepository> </pluginRepositories> </profile> </profiles>
- 远程仓库的访问认证:部分远程仓库需要用户名和密码进行认证
<servers> <server> <id>release</id> <!-- id必须与需要认证的远程仓库ID一致 --> <username>admin</username> <password>123</password> </server> </servers>
- 设置镜像:将对指定远程仓库的访问转发到镜像上,一般用于提高下载速度(这里的镜像可以覆盖前面的远程仓库设置)
<mirrors> <mirror> <id>mirror-central</id> <!-- 当前镜像的唯一ID --> <name>中央仓库在中国的镜像</name> <url>http://maven.net.cn/content/groups/public/</url> <!-- 镜像地址 --> <mirrorOf>central<mirrorOf> <!-- 镜像代理的仓库ID,可以用“,”分隔多个仓库ID,*-所有maven仓库 --> </mirror> </mirrors>
-
部署至远程仓库的配置:经过以上配置,可以从仓库下载依赖,但无法部署依赖,因此需要单独设置部署构件的仓库。使用mvn deploy命令部署至远程仓库
<distributionManager> <!-- 部署发布版本构件的配置 --> <repository> <id>deploy-release</id> <name>部署发布版本构件的仓库</name> <url>${deploy_release_url}</url> </repository> <!-- 部署快照版本构件的配置 --> <snapshotRepository> <id>deploy-snapshot</id> <name>部署快照版本构件的仓库</name> <url>${deploy_snapshot_url}</url> </snapshotRepository> </distributionManager>
3) 从仓库下载依赖的机制
- 当scope为system时,根据路径从本地文件系统解析
- 其它scope根据依赖坐标计算仓库路径后,首先从本地仓库查找
- 本地仓库不存在则从远程仓库查找(每次构建时,SNAPSHOT版本都需要从远程仓库重新下载)