Maven

1 Maven 介绍

1.1 是什么

Maven 是一个项目管理工具,可被用于构建和管理各种项目。例如java, C#,Ruby,Scala 和其他语言编写的项目。

Maven 基于项目对象模型(缩写:POM),利用一个中央信息片断能管理一个项目的构建(编译、测试、运行、打包、安装、部署)、依赖管理等。

1.2 Maven 特点

  • 项目设置遵循统一的规则。
  • 任意工程中共享。
  • 依赖管理包括自动更新。
  • 一个庞大且不断增长的库。
  • 可扩展,能够轻松编写 Java 或脚本语言的插件。
  • 只需很少或不需要额外配置即可即时访问新功能。
  • 基于模型的构建 − Maven 能够将任意数量的项目构建到预定义的输出类型中,如 JAR,WAR 或基于项目元数据的分发,而不需要在大多数情况下执行任何脚本。
  • 项目信息的一致性站点 − 使用与构建过程相同的元数据,Maven 能够生成一个网站或PDF,包括您要添加的任何文档,并添加到关于项目开发状态的标准报告中。
  • 发布管理和发布单独的输出 − Maven 将不需要额外的配置,就可以与源代码管理系统(如 Subversion 或 Git)集成,并可以基于某个标签管理项目的发布。它也可以将其发布到分发位置供其他项目使用。Maven 能够发布单独的输出,如 JAR,包含其他依赖和文档的归档,或者作为源代码发布。
  • 向后兼容性 − 您可以很轻松的从旧版本 Maven 的多个模块移植到 Maven 3 中。
  • 子项目使用父项目依赖时,正常情况子项目应该继承父项目依赖,无需使用版本号,
  • 并行构建 − 编译的速度能普遍提高20 - 50 %。
  • 更好的错误报告 − Maven 改进了错误报告,它为您提供了 Maven wiki 页面的链接,您可以点击链接查看错误的完整描述。

1.3 项目目录结构

Maven 提倡按照如下标准目录结构进行配置:

目录 目的
${basedir} 存放 pom.xml 和所有的子目录
${basedir}/src/main/java 项目的 java 源代码
${basedir}/src/main/resources 项目的资源,比如说 property 文件,springmvc.xml
${basedir}/src/test/java 项目的测试类,比如说 Junit 代码
${basedir}/src/test/resources 测试用的资源
${basedir}/src/main/webapp/WEB-INF web 应用文件目录,web 项目的信息,比如存放 web.xml、本地图片、jsp 视图页面
${basedir}/target 打包输出目录
${basedir}/target/classes 编译输出目录
${basedir}/target/test-classes 测试编译输出目录
Test.java Maven 只会自动运行符合该命名规则的测试类
~/.m2/repository Maven 默认的本地仓库目录位置

2 Maven POM

Maven 使用 POM(Project Object Model,项目对象模型)用来描述项目基本信息。

执行项目时,Maven 会在当前目录中找并读取 pom.xml 文件,获取所需的配置信息来执行。

所有 pom.xml 都需要有 project 元素和三个必需字段:groupId,artifactId,version。

节点 描述
project 工程的根标签。
modelVersion 模型版本需要设置为 4.0。
groupId 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.companyname.project-group 拥有所有的和银行相关的项目。
artifactId 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。
version 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如:com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1

3 Maven 构建生命周期

Maven 的典型生命周期由下面几个阶段组成:

阶段 处理 描述
验证 validate 验证项目 验证项目是否正确且所有必须信息是可用的
编译 compile 执行编译 源代码编译在此阶段完成
测试 Test 测试 使用适当的单元测试框架(例如JUnit)运行测试。
包装 package 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包
检查 verify 检查 对集成测试的结果进行检查,以保证质量达标
安装 install 安装 安装打包的项目到本地仓库,以供其他项目使用
部署 deploy 部署 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

4 settings.xml

settings.xml 是 maven 的全局配置文件,pom.xml 是所在项目的局部配置文件。Settings.xml中包含类似本地仓储位置、修改远程仓储服务器、认证信息等配置。

settings.xml文件一般存在于两个位置:

  • 全局配置: ${M2_HOME}/conf/settings.xml
  • 用户配置: user.home/.m2/settings.xml (用户配置优先于全局配置)

配置优先级从高到低:pom.xml> user settings > global settings

5 Maven 仓库

Maven 项目中依赖的第三方库所在的位置叫做仓库。

Maven 仓库有三种类型:

  • 本地(local)

    • Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。

      1
      2
      3
      4
      5
      6
      <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>C:/MyLocalRepository</localRepository>
      </settings>
  • 中央(central)

    • 这个仓库由 Maven 社区管理,包含了大量常用的库。
    • 不需要配置,需要通过网络才能访问。
  • 远程(remote,私服)

    • 开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件

6 Maven 快照

快照是模块的临时版本。maven 根据模块的版本号( pom 文件中的 version )中是否带有-SNAPSHOT来判断是快照版本还是正式版本。

  • 对于快照版本,执行 mvn deploy 时会自动发布到快照版本库中,并覆盖老的快照版本。依赖快照版本的模块,在不更改版本号的情况下,编译打包时,maven 自动从镜像服务器上下载最新的快照版本。

  • 对于正式发布版本,执行 mvn deploy 时会自动发布到正式版本库中。依赖正式版本的模块,在不更改版本号的情况下,编译打包时如果本地已经存在该版本的模块,则不会主动去镜像服务器上下载。

在开发阶段,使用快照版本进行开发,能够使依赖快照版本的模块不需要修改 pom 文件版本号也能下载新的版本,从而提升开发效率。