Maven核心
Maven 的主要功能
项目构建
项目构建,是指一个项目编译,测试,打包,安装,部署 等过程。
- maven功能的主体。
构建 build:是面向过程的(从开始到结尾的多个步骤),涉及到多个环节的协同工作。
管理依赖
管理依赖,也就是管理项目中使用jar包和资源等。
只需要声明即可, 剩下的下载引用都由maven完成。
管理项目信息
管理项目信息其实就是生成一个站点文档,也可以由maven完成。
构建过程的主要环节
- 清理:删除以前的编译结果,为重新编译做好准备。
- 编译:将Java源程序编译为字节码文件。
- 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
- 报告:在每一次测试后以标准的格式记录和展示测试结果。
- 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web 工程对应war包。
- 安装:在Maven环境下特指将打包的结果(jar包或war包)安装到本地仓库中。
- 部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
- 通常手动进行部署,自动化部署更麻烦。
Maven 的生命周期
构建过程从上至下,称为Maven的生命周期,执行下方的构建环节时,会从头(清理)开始,依次向下执行,直至指定的生命周期。
构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成。不论现在要执行生命周期中的哪个阶段,都是从这个生命周期的最初阶段开始的。
- 无论我们要进行哪个阶段的构建,直接执行相应的命令即可,无需担心它前边阶段是 否构建,Maven 都会自动构建。
Maven 命令
# 查看 maven 版本信息
mvn -v
# 以下命令都需在 项目根目录(pom.xml所在目录)下 运行
mvn clean # 清理(会删除原来编译和测试的目录,即 target 目录,已经 install 到仓库里的包不会删除)
mvn compile # 带包编译主程序
# 将 main/java 目录及子目录下的所有 .java 文件带包编译后放置在 target/classes 目录下
# 将 main/resources 目录下的所有文件和目录,直接拷贝至 target/classes 目录下
# (java源码中,可将resources目录和java目录视为同级)
mvn test-compile # 编译测试程序(会在当前目录下生成一个 target,里边存放编译测试程序之后生成的字节码文件)
mvn test # 测试
# 将 test/java 目录及子目录下的所有 .java 文件带包编译后放置在 target/test-classes 目录下
# 将 test/resources 目录下的所有文件和目录,直接拷贝至 target/test-classes 目录下
# 生成一个目录surefire-reports,保存测试结果
# (java源码中,可将resources目录和java目录视为同级)
mvn package # 打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包)
mvn install # 安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中)
mvn deploy # 部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到 web 容器中)。通常手动进行部署Maven 的核心概念
- POM:项目对象模型。maven 把一个项目当做一个模型使用围绕着pom.xml,来控制 maven 构建项目的过程、管理jar依赖。
- 约定的目录结构:maven 项目的目录和文件的位置都是规定的。
- 坐标(GAV):是一个唯一的字符串,用来表示资源的。
- 依赖管理:管理你的项目可以使用jar文件
- 仓库管理:你的资源存放的位置
- 生命周期:maven工具构建项目的过程,就是生命周期。
- 插件:执行maven构建的时候用的工具是插件。
- 目标(target):maven 编译、打包的结果会放在结果目录
./target下。 - 继承
- 聚合
Maven 目录结构
ROOT # 项目根,工程名
|---src # 项目源代码
|---main # 主程序
|---java # 主程序的java源码
|---resources # 主程序的配置、资源文件
|---test # 测试程序
|---java # 测试程序的java源码
|---resources # 测试程序的配置文件
|---target # 构建结果目录(Maven生成并管理)
|---classes
# src/main/java 下所有 .java 带包编译后的 class
# src/main/resources 所有文件的直接拷贝
...
|---pom.xml # Maven 工程的核心配置文件。- pom.xml 记录的关于构建项目的各个方面的设置,maven 从 pom.xml 文件开始,按照助约定的工程目录编译,测试,打包,部署,发布项目。
- 项目中maven的使用,基本就是编写 pom.xml 的过程。
POM 文件
POM:Project Object Model 项目对象模型。Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中 进行声明,以方便进行构建和描述。
- pom.xml 是 Maven 的灵魂。
- maven 环境搭建好之后,所有的学习和 操作都是关于 pom.xml 的。
基本信息
基本信息指项目的坐标(gav)、使用的 maven 版本、打包类型等。
<modelVersion></modelVersion>
<!--
Maven 模型的版本,对于 Maven2 和 Maven3 来说,它只能是 4.0.0
-->
<!-- gav -->
<groupId></groupId>
<!--
组织 id,一般是公司域名的倒写。 格式可以为:
1. 域名倒写。 例如 com.baidu
2. 域名倒写+项目名。例如 com.baidu.appolo
-->
<artifactId></artifactId>
<!--
项目名称,也是模块名称,对应 groupId 中的子项目。
-->
<version></version>
<!--
项目的版本号。如果项目还在开发中,是不稳定版本,通常在版本后带-SNAPSHOT,表示是快照版。
version 使用点分数字标识,例如 1.1.0
-->
<package></package>
<!--
项目打包的类型,可以使 jar、war、rar、ear、pom。
默认是 jar
-->根据基本信息的配置,可以将项目打包放到仓库的 groupId/artifactId/version 目录下。
- 根据 gav 在仓库中定位时,也是按这个路径寻找。
- groupId、artifactId 和 version 决定项目在仓库中的路径
- artifactId 和 version 决定 jar 包的名称。
依赖
<!-- 所有的外部jar依赖都在此处配置 -->
<dependencies>
<!-- 每一个jar对应一个 dependency -->
<dependency>
<!-- gav -->
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!-- 依赖范围 -->
<scope></scope>
</dependency>
...
</dependencies>- 依赖需要的配置信息可以在 https://mvnrepository.com/ 搜索到。
依赖的范围:compile、test、provided,默认采用 compile。

provided:表示该jar包只用于编译,在打包的文件中不用包含此jar包。
如:servlet、jsp等依赖,tomcat服务器内置有,不需要额外提供。
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency>
配置属性
配置属性是用来定义一些属性的(基本信息是配置项目,这里是配置maven),这些属性可以是maven需要,也可以作为 pom.xml 的全局变量使用。
<properties>
<!--
源码编译 jdk 版本
-->
<maven.compiler.source>1.8</maven.compiler.source>
<!--
运行代码的 jdk 版本
-->
<maven.compiler.target>1.8</maven.compiler.target>
<!--
项目构建时使用的编码方式
可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级
-->
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<!--
生成报告的编码
-->
<project.reporting.outputEncoding>
UTF-8
</project.reporting.outputEncoding>
...
<!-- 全局变量 -->
<变量名>变量值</变量名>
...
</properties>全局变量可以在 pom.xml 文件的任意位置引用:
<!--定义全局变量-->
<properties>
<spring.version>4.3.10.RELEASE</spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<!--引用全局变量:${变量名} -->
<version>${spring.version}</version>
<!-- 等价:<version>4.3.10.RELEASE</version> -->
</dependency>构建
构建用来配置与构建相关的设置,例如编译插件的JDK版本。
<build>
<plugins>
<plugin>
<!-- gav -->
<!-- 编译插件 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>
maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<!--编译所用JDK版本-->
<source>1.8</source>
<!--运行所用JDK版本-->
<target>1.8</target>
</configuration>
</plugin>
</plugins>
...
</build>指定其他资源位置:
默认情况下,src/main/java 和 src/test/java 目录及子目录的非 .java 文件都会被忽略。当需要将其中的非.java文件包含至结果中,则需要进行配置。
<build>
<resources>
<resource>
<!--所在的目录-->
<directory>src/main/java</directory>
<!--
包括目录下的 .properties .xml 文件都会扫描到
-->
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!--
filtering 选项 false 不启用过滤,
*.property 已经起到过滤的作用了
-->
<filtering>false</filtering>
</resource>
</resources>
</build>继承
在 Maven 中,如果多个模块都需要声明相同的配置,例如:groupId、 version、有相同的依赖、或者相同的组件配置等,也有类似 Java 的继承机 制,用 parent 声明要继承的父工程的 pom 配置。
<parent>
<!--父工程的GAV-->
</parent>聚合
在 Maven 的多模块开发中,为了统一构建整个项目的所有模块,可以提供一 个额外的模块,该模块打包方式为 pom,并且在其中使用 modules 聚合的 其它模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块,叫 Maven 的聚合。
<modules>
...
</modules>仓库
在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven 核心程序仅仅定义了自动化构建项目的生命周期,但具体的构建工作是由特定的构件完成的。
为了提高构建的效率和构件复用,maven把所有的构件统一存储在某一个位置,这个位置就叫做仓库。
Maven 仓库存有:
- Maven 需要的插件。每个插件也是一个jar。
- 三方框架或工具的jar包。
- 自己打包安装的模块(jar、war等)。
Maven 仓库可大体分为 本地仓库 和 远程仓库。
本地仓库
本地仓库存放于当前的电脑上,默认存放在 ~\.m2\repository 中,为本机上所有的Maven工程服务。
可以通过Maven的配置文件 %M2_HOME%/conf/settings.xml 中修改本地仓库所在的目录。
<settings>
<localRepository>
D:/Projects/repository
</localRepository>
...
<!-- 设置远程仓库镜像 -->
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>
https://maven.aliyun.com/repository/central
</url>
</mirror>
</mirrors>
...
</settings>远程仓库
远程仓库需要联网才能使用,是多个用户共享的。
- 中央仓库:为全世界范围内的开发人员提供服务。最权威的仓库。
- 中央仓库镜像:为全世界范围内某些特定的用户提供服务的。用以分担中央仓库压力。
- 私服:组织或区域架设的私有仓库。一种特殊的远程仓库。
中央仓库:Maven 默认的远程仓库,地址:http://repo.maven.apache.org/maven2/。包含了绝大多数流行的开源Java构件,以及源码、作者信息、许可证信息等。一般来说,简单的 Java项目依赖的构件都可以在这里下载得到。
中央仓库镜像:架设在不同位置,欧洲,美洲,亚洲等每个洲都有若干的服务器,为中央仓库分担流量。减轻中央仓库 的访问,下载的压力。所在洲的用户首先访问的是本洲的镜像服务器。
私服:代理广域网上的远程仓库,供局域网内的 Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。
- 我们还可以把一些无法从外部仓库下载到的构件上传到私服上。

Maven 对仓库的使用
需要三方jar --> 查找本地仓库:
- 找到了 --> 直接使用。
- 没找到 --> 联网查询远程仓库:
- 找到了 --> 下载至本地仓库 --> 使用。
- 没找到或没联网 --> 构建失败 BUILD FAILED。
