目录

了解Maven

概述

第1章 Maven 简介

第2章 Maven 的安装和配置

Mac 下直接 brew install maven,升级也很简单 brew upgrade maven,查询 Maven 的版本用 mvn- v

设置代理

1
2
3
4
5
# ping repo1.maven.org
PING sonatype.map.fastly.net (151.101.196.209): 56 data bytes
64 bytes from 151.101.196.209: icmp_seq=0 ttl=54 time=185.673 ms
64 bytes from 151.101.196.209: icmp_seq=1 ttl=54 time=186.361 ms
64 bytes from 151.101.196.209: icmp_seq=2 ttl=54 time=186.155 ms

settings.xml 文件非常重要,可以从 M2_HOME/conf/settings.xml 复制。

第3章 Maven 使用入门

项目的主代码会被打包到最终的构件中,如 jar,而测试代码只在运行测试的时候用到,不会被打包。默认情况下,Maven 假设项目主代码位于 src/main/java。 编译的命令 mvn clean compile clean 会告诉 Maven 清理输出目录 target/,compile 告诉 Maven 编译项目主代码。

主类就算在 jar 里面也是不能直接运行的,因为带有 main 方法的类信息不会添加到 manifest 中。为了可以生产可执行的 jar 文件,需要借助 maven-shape-plugin 插件。然后运行 java-jar 命令运行该 jar 包。

第5章 坐标和依赖

Maven 的一大功能是管理项目的依赖。为了自动化解析任何一个 Java 构件,就必须为它们唯一标识,这就是依赖管理的底层基础。

groupId

不对应实际项目,一般定义当前 Maven 项目隶属的实际项目。

artifactId

定义实际项目中的一个 Maven 项目或者模块。默认情况下,Maven 生成的构件,其文件名会以 artifactId 作为开头。如:recall-0.1.0.jar

version

定义 Maven 项目当前所处的版本。

packing

定义 Maven 项目的打包方式。

classifier

帮助定义构建输出的一些附属构件。附属构件与主构件对应。packing 是可选的,classifier 是不能直接定义的。

依赖的配置

依赖的范围

依赖范围是用来库功能之依赖与三种 classpath,编译、测试、运行的关系。

第6章 仓库

对于 Maven 来说,仓库只分为本地和远程。默认会先查看本地仓库,再到远程仓库。 存放本地仓库的地址可以通过更改 setting.xml 中的 localRepository。 远程仓库除了 Maven 的 repo 还有 JBoss Maven 等等。基本上只要配置一下 url 即可。

在 Maven 的世界里,任何一个项目或者构件都必须有自己的版本。不管是正式还是快照版本。快照版本一定程度上可以避免对版本号的滥用。在发布过程中 Maven 会自动为构件打上时间戳。默认情况下,Maven 会主动每天更新一次,也可以通过配置仓库的 updatePolicy 控制。用户也可以使用命令 -U 参数强制让 Maven 检查更新,如 mvn clean install-U

如果仓库 X 能够提供仓库 Y 存储的所有内容,那么认为 X 是 Y 的一个镜像。任何一个从仓库 Y 获得的构建,都能从它的镜像中获取。一般常见的实践是镜像结合私服,由于私服可以代理任何外部的公共仓库(包括中央仓库),因此对于组织内部的 Maven 用户来说,使用一个私服地址就等于使用了所有需要的外部仓库,这可以将配置集中到私服,从而简化 Maven 本身的配置。

第7章 生命周期和插件

生命周期包括了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。Maven 拥有三套相互独立的生命周期,分别是 clean, default, site。每个生命周期包含一些阶段。

clean生命周期

pre-clean 执行一些清理前需要完成的工作 clean 清理上一次构建生成的文件 post-clean 执行一些清理后需要完成的工作

default生命周期

定义了真正构建时所需要执行的所有步骤。是所有生命周期中最核心的部分,包含了常用的 test, package, install, deploy 等阶段。

site生命周期

建立和发布项目站点,基于 POM 所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。 pre-site 执行一些在生成项目站点之前需要完成的工作 site 生成项目站点文档 post-site 执行一些在生成项目站点之后需要完成的工作 site-deploy 将生成的项目站点发布到服务器上

命令行是最主要的方式调用生命周期阶段。各个生命周期相互独立,但是阶段之间是前后依赖的。 Maven 的核心仅仅是定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构件形式存在。除了内置绑定方式,还有自定义的方式,这种绑定方式能让 Maven 项目在构建过程中执行更多更富有特色的任务。

常见例子是创建项目的源码 jar 包,内置的插件绑定关系中并没有涉及这个任务,需要用户自行配置,maven-source-plugin,他的 jar-no-fork 目标能够将项目的主代码打成 jar 文件。可以将其绑定到 default 生命周期的 verify 阶段,在执行完集成测试后和安装构件之前创建源码 jar 包。

完成了插件和生命周期的绑定之后,还可以配置插件目标的参数,进一步调整插件目标所执行的任务,以满足项目需求。

参考资料

警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。