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 文件版本号也能下载新的版本,从而提升开发效率。