Maven-工具简介:

Apache Maven是跨平台的项目管理工具,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。Maven可以自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。Maven最大化地消除了构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件,我们不再需要定义过程,甚至不需要再去实现这些过程中的一些任务。 最简单的例子就是测试,我们没必要告诉Maven去测试,更不需要告诉Maven如何运行测试,只需要遵循Maven的约定编写好测试用例当我们运行构建的时候,这些测试便会自动运行。

Maven-环境配置:

Maven是一个基于Java的构建工具,所以在安装Maven之前必须配置好Java的相关环境。

  1. 检查JAVA环境是否正常:

    java -version
  2. 下载并解压Maven: 下载

 Mac用户可以使用[Homebrew](https://brew.sh/)来安装Maven
brew search maven  # 搜索
brew install maven # 安装
  1. 设置Maven环境变量:
export M2_HOME=/Users/Hostname/Software/apache-maven-3.3.9
export PATH=$PATH:$M2_HOME/bin
  1. 验证Maven是否安装成功:
输入:  mvn -v 或者 mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec38323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /Users/Hostname/Software/apache-maven-3.3.9
Java version: 1.8.0_121, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.12.3", arch: "x86_64", family: "mac"

Maven-POM:

什么是POM?

POM 代表工程对象模型。它是使用 Maven 工作时的基本组建,是一个 xml 文件。它被放在工程根目录下,文件命名为 pom.xml。
POM 包含了关于工程和各种配置细节的信息,Maven 使用这些信息构建工程。

    * project dependencies
    * plugins
    * goals
    * build profiles
    * project version
    * developers
    * mailing list

在仓库中工程组(groupId),及其名称(artifactId)和版本这些属性是工程的唯一标识。

POM文件示例:

<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
http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>ws.object</groupId>
  <artifactId>mvnPro</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>mvnPro</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

需要说明的是每个工程应该只有一个 POM 文件。

  • 所有的 POM 文件需要 project 元素和三个必须的字段:groupId, artifactId,version。
  • 在仓库中的工程标识为 groupId:artifactId:version
  • POM.xml 的根元素是 project,它有三个主要的子节点:

POM文件节点详解:

节点 描述
groupId 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 ws.object.mvn 拥有所有的和银行相关的项目。
artifactId 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId和artifactId 一起定义了 artifact 在仓库中的位置。
version 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如:ws.object.mvn:consumer-banking:1.0 ws.object.mvn:consumer-banking:1.1.

Maven-构建生命周期

什么是构建?

除了编写源代码,我们每天有相当一部分时间花在了编译、运行单元测试、生成文档、打包和部署等繁琐而不起眼的工作上,这就是构建(build)。

Maven的三套生命周期

Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,一般容易将Maven的生命周期看成一个整体,其实不然。这三套生命周期分别是:

  • Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  • Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
  • Site Lifecycle 生成项目报告,站点,发布站点。

我再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。

每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:

  • pre-clean 执行一些需要在clean之前完成的工作
  • clean 移除所有上一次构建生成的文件
  • post-clean 执行一些需要在clean之后立刻完成的工作

Site生命周期的各个阶段:

  • pre-site 执行一些需要在生成站点文档之前完成的工作
  • site 生成项目的站点文档
  • post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy 将生成的站点文档部署到特定的服务器上

Default生命周期:

Maven中最重要的Default生命周期,绝大部分工作都发生在这个生命周期中,下面列出一些常用的阶段:

生命周期阶段 描述
validate 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。
initialize 初始化构建状态,例如设置属性。
generate-sources 生成编译阶段需要包含的任何源码文件。
process-sources 处理源代码,例如,过滤任何值(filter any value)。
generate-resources 生成工程包中需要包含的资源文件。
process-resources 拷贝和处理资源文件到目的目录中,为打包阶段做准备。
compile 编译工程源码。
process-classes 处理编译生成的文件,例如 Java Class 字节码的加强和优化。
generate-test-sources 生成编译阶段需要包含的任何测试源代码。
process-test-sources 处理测试源代码,例如,过滤任何值(filter any values)。
test-compile 编译测试源代码到测试目的目录。
process-test-classes 处理测试代码文件编译后生成的文件。
test 使用适当的单元测试框架(例如JUnit)运行测试。
prepare-package 在真正打包之前,为准备打包执行任何必要的操作。
package 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR或者EAR文件。
pre-integration-test 在集成测试执行之前,执行所需的操作。例如,设置所需的环境变量。
integration-test 处理和部署必须的工程包到集成测试能够运行的环境中。
post-integration-test 在集成测试被执行后执行必要的操作。例如,清理环境。
verify 运行检查操作来验证工程包是有效的,并满足质量要求。
install 安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。
deploy 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。

Maven-仓库

什么是 Maven 仓库?

在 Maven 的术语中,仓库是一个位置(place),例如目录,可以存储所有的工程 jar 文件、library jar 文件、插件或任何其他的工程指定的文件。

Maven 仓库有三种类型:

  • 本地(local)
  • 中央(central)
  • 远程(remote)

本地仓库:

Maven 本地仓库是机器上的一个文件夹。它在你第一次运行任何 maven 命令的时候创建。

Maven 本地仓库保存你的工程的所有依赖(library jar、plugin jar 等)。当你运行一次 Maven 构建,Maven
会自动下载所有依赖的 jar 文件到本地仓库中。它避免了每次构建时都引用存放在远程机器上的依赖文件。
Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。

​```
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <localRepository>/Users/HostName/Public/MavenRepository</localRepository>
</settings>
​```

中央仓库:

Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。中央仓库的关键概念:

* 这个仓库由 Maven 社区管理。
* 不需要配置。
* 需要通过网络才能访问。

要浏览中央仓库的内容,maven 社区提供了一个 URL:http://search.maven.org/#browse。使用这个仓库,开发人员可以搜索所有可以获取的代码库。

远程仓库:

如果 Maven 在中央仓库中也找不到依赖的库文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的jar 文件。举例说明,使用下面的 POM.xml,Maven 将从远程仓库中下载该 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
http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ws.object</groupId>
    <artifactId>mvnPro</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>com.companyname.common-lib</groupId>
            <artifactId>common-lib</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependencies>
    <repositories>
        <repository>
            <id>companyname.lib1</id>
            <url>http://download.companyname.org/maven2/lib1</url>
        </repository>
        <repository>
            <id>companyname.lib2</id>
            <url>http://download.companyname.org/maven2/lib2</url>
        </repository>
    </repositories>
</project>
​```

Maven 依赖搜索顺序:

当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:

1. 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
2. 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中已被将来引用。
3. 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
4. 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库已被将来引用,否则 Maven将停止处理并抛出错误(无法找到依赖的文件)。

Maven-插件

什么是 Maven 插件?

Maven实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven插件通常被用来:

  • 创建 jar 文件
  • 创建 war 文件
  • 编译代码文件
  • 代码单元测试
  • 创建工程文档
  • 创建工程报告

插件通常提供了一个目标的集合,并且可以使用下面的语法执行:

mvn [plugin-name]:[goal-name]

例如,一个 Java 工程可以使用 maven-compiler-plugin 的 compile-goal 编译,使用以下命令:

mvn compiler:compile

插件类型

Maven 提供了下面两种类型的插件:

类型 描述
Build plugins 在构建时执行,并在 pom.xml 的元素中配置。
Reporting plugins 在网站生成过程中执行,并在 pom.xml 的元素中配置。
###常用插件列表:
插件 描述
clean 构建之后清理目标文件。删除目标目录。
compiler 编译 Java 源文件。
surefile 运行 JUnit 单元测试。创建测试报告。
jar 从当前工程中构建 JAR 文件。
war 从当前工程中构建 WAR 文件。
javadoc 为工程生成 Javadoc。
antrun 从构建过程的任意一个阶段中运行一个 ant 任务的集合。

Maven-创建工程

Maven 使用原型(archetype)插件创建工程。要创建一个简单的Java应用,我们将使用 maven-archetype-quickstart 插件。在下面的例子中,我们将创建一个基于 maven 的 java 应用工程。

mvn archetype:generate \
-DgroupId=ws.object \
-DartifactId=Example \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
……
------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.277 s
[INFO] Finished at: 2017-07-13T14:10:19+08:00
[INFO] Final Memory: 14M/214M
[INFO] ------------------------------------------------------------------------

出现 BUILD SUCCESS 即项目创建成功!

模板 含义
mvn archetype:generate 固定格式
-DgroupId 组织标识(包名)
-DartifactId 项目名称
-DinteractiveMode 是否使用交互模式
-DarchetypeArtifactId 指定ArchetypeId,maven-archetype-quickstart,创建一个Java Project;maven-archetype-webapp,创建一个Web Project

Maven-工程模板(archetype)

Maven 使用原型(Archetype)概念为用户提供了大量不同类型的工程模版(614 个)。Maven 使用下面的命令帮助用户快速创建 java 项目。

mvn archetype:generate

什么是原型?

原型是一个 Maven 插件,它的任务是根据模板创建一个项目结构。我们将使用 quickstart 原型插件创建一个简
单的 java 应用程序。

Maven-web应用

创建 Web 应用建立一个简单的 Java web 应用,我们可以使用 maven-archetype-webapp 插件。首先我们打开terminal,输入以下的 mvn 命令。mvn archetype:generate \-DgroupId=ws.object.example \-DartifactId=example \-DarchetypeArtifactId=maven-archetype-webapp \-DinteractiveMode=falseMaven 将开始处理并且将创建完整的基于 Web 的 java 应用工程结构。

Maven-参考资料