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