Maven 指南

简介

Maven 主要用于 Java 项目构建、依赖管理和项目信息管理。能够帮助我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。Maven 减轻了 构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件。

简单的来说,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(详情如下)

image.png

<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>

依赖规则

传递性依赖

  1. 路径最近者优先。(依赖传递层数越少的优先)
  2. 第一声明优先。(依赖传递层数相同时,声明顺序越前的优先)

优化依赖

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>:匹配 repo1repo2 仓库。
  • <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 所有阶段。