Skip to content

Maven 基础

1. 概述

Maven 是基于项目对象模型 (POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具 [百度百科]

大白话讲,Maven 是一个基于 Java 平台的自动化构建工具,帮助我们管理 jar 包和拆分项目。

2. Maven 安装

安装 Maven 前提本机已经安装可 JDK;下载安装包后解压到任意目录:

(1) 配置环境变量

新增环境变量 M2_HOME:D:\Java\apache-maven-3.8.5

修改环境变量 Path:%M2_HOME%\bin

配置完成后,启动命令行窗口输入 mvn -v 出现版本信息表示安装成功。

(2) 修改本地仓库地址

打开 \conf\settings.xml 文件,修改 localRepository 标签中地址为本地路径:

(3) 添加 Maven 镜像

Maven 仓库默认在国外,国内使用难免很慢,我们可以更换为阿里云的,打开 \conf\settings.xml 文件,在 mirrors 标签下添加如下内容:

xml
<!--阿里云镜像-->
<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    <mirrorOf>central</mirrorOf>
</mirror>

<!-- junit镜像地址 -->
<mirror>
    <id>junit</id>
    <name>junit Address/</name>
    <url>http://jcenter.bintray.com/</url>
    <mirrorOf>central</mirrorOf>
</mirror>

3. Maven 构建生命周期

Maven 构建生命周期定义了一个项目构建跟发布的过程,一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的:

整个生命周期有一些常用的命令:

命令描述
mvn clean删除target目录(删除编译文件的目录)
mvn compile只编译main目录中的java文件
mvn test执行test目录下的测试用例
mvn package将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件
mvn install安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖

4. POM 文件

POM 文件的基本结构如下所示:

xml
<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">
    <!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变, 虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。 -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.liu.learning,maven会将该项目打成的jar包放本地仓库下的:/com/liu/learning 目录下下-->
    <groupId>com.ming.learning</groupId>
    <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
    <artifactId>HelloWorld</artifactId>
    <!-- 版本号 -->
    <version>0.0.1-SNAPSHOT</version>
    <!--项目的名称, Maven产生的文档用 -->
    <name>HelloWorld01</name>
    <!--项目产生的构件类型,例如jar、war、ear、pom。 -->
    <packaging>jar</packaging>
    <!--项目描述 -->
    <description>hello world</description>

    <!-- 统一JDK版本 -->
    <profiles>
        <profile>
            <id>jdk-1.8</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>1.8</jdk>
            </activation>
            <properties>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
                <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
            </properties>
        </profile>
    </profiles>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!-- jar包的作用范围 -->
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

5. jar 包作用范围 scope

常用的三个分别是 compile,test,provided,作用范围如下表:

compile:缺省值,如果不显式声明默认为 compile,适用于所有阶段,会随着项目一起发布。

test:jar 包只在测试阶段需要,常见的 jar 比如说 junit

provided:jar 包只在编译和测试时需要,这种比较少见,比如说 servlet-api.jar

6. Maven 依赖

依赖一个 Jar 包,使用如下格式:

xml
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.6.RELEASE</version>
</dependency>

排除依赖,使用如下格式:

xml
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.6.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
        </exclusion>
    </exclusions>
</dependency>

7. Maven 依赖传递与依赖原则

7.1 依赖传递

在数学上,若 A 依赖于 B,B 依赖于 C,那么 A 依赖于 C 成立,但在 Maven 中还需要添加一个条件,要使 A.jar 依赖于 C.jar,当且仅当 B.jar 依赖于 C.jar 的范围是 compile。

7.1 依赖原则

路径最近者优先。

第一声明者优先。

8. 统一版本管理

使用 pom 里的 properties 标签,自定义一个 xxx 标签,标签内就是版本号,在需要使用的地方使用 ${xxx} 灵活取出上面定义的值:

xml
<properties>
    <junit>4.12</junit>
</properties>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit}</version>
        <scope>compile</scope>
    </dependency>
</dependencies>