Maven 指南
简介
Maven 主要用于 Java 项目构建、依赖管理和项目信息管理。能够帮助我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。Maven 减轻了 构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件。
简单的来说,Maven 是一个 构建工具、依赖管理工具、项目信息管理工具。
构建:编译、运行单元测试、生成文档、打包和部署。
扩展 —— 同类软件
- Make:一个指令工具,它解释 makefile 中的指令或者说规则。很难跨平台构建。
- Ant(Another Neat Tool):使用 Java 编写的软件构建工具,跨平台,使用 xml 定义 s 构建脚本。
- Grable:基于 Ant 和 Maven 概念的项目自动化构建开源工具。使用一种基于 Groovy 的特定领域语言来声明项目设置
POM配置
Maven 为 Java 引入了一个新的依赖管理系统。groupId、artifactId、version 组成的坐标唯一标识一个依赖。
配置说明
- pom(Project Object Model):项目对象模型。
- modelVersion:模型版本(Maven2/3 只能是 4.0.0)
- groupId:项目,那个组,通常为域名倒序,例如 yujian95.cn -> cn.yujian95
- artifactId:模块,组内唯一 ID
- version:版本号,SNAPSHOT(快照,即不稳定版本)
- name:项目名
- package:打包方式,可选:pom、war、jar(默认)
<?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>
<groupId>cn.yujian95.little</groupId>
<artifactId>little</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>little</name>
<description>Little project for Spring Boot</description>
</project>
- dependencies:依赖列表
- dependency:依赖包-groupId、artifactId、version:基本坐标,同上
- type:依赖类型,同
package
,jar(默认,可不填)-exclusions:排除传递性依赖(排除依赖) - optional:是否可选;可选依赖,只对当前项目有效,不会该依赖不会被传递
- scope:依赖范围,compile、test、provided、runtime、system、import(详情如下)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<scope>compile</scope>
<type>jar</type>
<exclusions>
<!--需要排查的依赖-->
<dependency>xxx</dependency>
<artifactId>xxx</artifactId>
<version>xxx</version>
</exclusions>
<!--需要排查的依赖-->
<optional>true</optional>
</dependency>
</dependencies>
Maven 属性
- properties,统一管理依赖版本。(归类依赖)
<properties>
<hutool.version>4.5.7</hutool.version>
</properties>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
依赖规则
传递性依赖
- 路径最近者优先。(依赖传递层数越少的优先)
- 第一声明优先。(依赖传递层数相同时,声明顺序越前的优先)
优化依赖
Maven 会自动解析所有项目的直接依赖和传递性依赖,并且根据规则正确判断每个依赖的范围,对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在。在这些工作之后,最后得到了的那些依赖被称为已解析依赖。
mvn dependency:list
查看mvn dependency:analyze
依赖分析(查看声明未使用依赖 / 使用未声明依赖)- 显式声明任何项目中直接用到的依赖。
仓库配置
仓库,即存放构件的地方。减少磁盘浪费、便以统一管理。大致分成俩类,远程仓库和本地仓库,还有一种特殊的远程仓库(私服,减少宽带、下载时间、存放内部构件,可以通过 Nexus
搭建私服)。
构件,在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可称做构件。
遵循坐标机制,Maven 将可以容易的找到对应的构件。
例如:log4j:log4j:1.2.15
->log4j/log4j/1.2.15/log4j-1.2.15.jar
。
当 Maven 使用构件的时候,会先在本地仓库查找是否存在该构件,有则直接使用;如果不存在的话,会从远程仓库下载构件,或者查看新版本。如果都没有的话,Maven 就会报错。
setting.xml
在本地仓库 conf
目录下,我们可以通过配置 setting.xml
修改本地仓库位置,还可以配置认证信息访问私服。
此外,因为国内访问中央仓库比较慢,一般来说,会通过配置国内镜像仓库,提高访问速度。
<mirrorOf>*</mirrorOf>
:匹配所有远程仓库。<mirrorOf>external:*</mirrorOf>
:匹配所有远程仓库,除 localhost 之外。<mirrorOf>repo1,repo2</mirrorOf>
:匹配repo1
、repo2
仓库。<mirrorOf>*,! repo1</mirrorOf>
:匹配所有远程仓库,除repo1
外仓库。
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
部署构件至远程仓库
我们可以在 pom.xml
通过 distributionManagement
将构件部署到远程仓库,运行 mvn clean deploy
<distributionManagement>
<!--发布版本-->
<repository>
<id>little</id>
<name>little-release</name>
<url>http://yujian.cn/xxx</url>
</repository>
<!--快照版本-->
<snapshotRepository>
<id>little</id>
<name>little-snapshot</name>
<url>http://yujian.cn/xxx</url>
</snapshotRepository>
</distributionManagement>
- LATEST:最新版本
- RELEASE:最新发布版本
- SNAPSHOT:快照版本,获取该版本最新代码
生命周期
Maven 的生命周期是所有构建过程的抽象和统一。包括项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成。即把所有项目的构建都映射到这样一个生命周期上。
Maven 的生命周期是抽象的,其本身并不做任何实际的公众,实际的任务都交由插件完成。(类似模板方法设计模式)Maven 为大多数构建步骤编写并绑定了默认插件。Maven 核心定义了 抽象的生命周期,具体的任务交由插件完成。
Maven 拥有三套相互独立的生命周期:clean、default、site。
clean:清理项目
- pre-clean:执行清理前需要完成的工作。
- clean:清理上次构建生成的文件。
- after-clean:执行清理后需要完成的工作。
default:构建时需要执行的所有步骤
比较复杂,这里主要讲解比较重要的部分。
- process-sources:处理项目主资源
src/main/resources
- compile:编译主源码
src/main/java
-process-test-sources:处理项目测试资源文件src/test/resources
- test-compile:编译项目的测试代码
src/test/java
- test:运行单元测试框架测试(不会打包或部署)
- package:接受编译好的 代码,打包成可发布的格式,如 JAR
- install:将包安装到本地仓库,供本地其他项目使用
- deploy:将生成的
war
/jar
包复制到远程仓库。
site:建立和发布项目站点
- pre-site:执行一些生成站点前的工作
- site:生成项目站点文档
- post-site:执行一些生成站点后的工作
- site-deploy:将生成的站点发布到服务器上
常用命令
-mvn clean
:调用 clean 生命周期的 clean 阶段,实际上为 pre-clean、clean 阶段。
-mvn test
:调用 default 生命周期的 test 阶段,实际上执行 validate -> test 所有阶段。
-mvn clean install
:调用 clean 生命周期的 clean 阶段和 default 生命周期的 install 阶段,实际执行 clean:pre-clean、clean 和 default:validate -> install 所有阶段。
评论