01 Maven 安装与配置
Maven 安装与配置
1. Maven 介绍
Maven 翻译为 “专家”,“内行”。Maven 是 Apache 下的一个纯 Java 开发的开源项目,它是一个项目管理工具,使用 Maven 对 Java 项目进行构建、依赖管理。
1.1 什么是项目构建
项目构建是一个项目从编写源代码到编译、测试、运行、打包、部署、运行的过程。
Maven 将项目构建的过程进行标准化,每个阶段使用一个命令完成,下图展示了构建过程的一些阶段,后面章节详细介绍每个阶段,这里先大概了解下:
上图中部分阶段对应命令如下:
- 清理阶段对应 Maven 的命令是 clean,清理输出的 class 文件
- 编译阶段对应 Maven 的命令是 compile,将 Java 代码编译成 class 文件。
- 打包阶段对应 Maven 的命令是 package,Java 工程可以打成 jar 包,web 包可以打成 war 包
运行一个 Maven 工程(web工程)需要一个命令:tomat:run
Maven 工程构建的优点:
- 一个命令完成构建、运行,方便快捷。
- Maven 对每个构建阶段进行规范,非常有利于大型团队协作开发。
1.2 什么是依赖管理
Maven 项目管理所依赖的 jar 包不需要手动向工程添加 jar 包,只需要在 pom.xml(Maven 工程的配置文件)添加 jar 包的坐标,自动从 Maven 仓库中下载 jar 包、运行,如下图:
使用 maven 依赖管理添加 jar 的好处:
- 通过 pom.xml 文件对 jar 包的版本进行统一管理,可避免版本冲突。
- Maven 团队维护了一个非常全的 Maven 仓库,里边包括了当前使用的 jar 包,Maven 工程可以自动从 Maven 仓库下载 jar 包,非常方便。
1.3 使用 Maven 的好处
通过上边介绍传统项目和 Maven 项目在项目构建及依赖管理方面的区域,Maven 有如下的好处:
- 一步构建。Maven 对项目构建的过程进行标准化,通过一个命令即可完成构建过程。
- 依赖管理。Maven 工程不用手动导 jar 包,通过在 pom.xml 中定义坐标从 Maven 仓库自动下载,方便且不易出错。
- Maven 的跨平台,可在 window、linux 上使用。
- Maven 遵循规范开发有利于提高大型团队的开发效率,降低项目的维护成本,大公司都会考虑使用 Maven 来构建项目。
2. Maven 的安装与配置
Maven 是基于 Java 开发的,无论是 Windows 上还是 Linux 上直接解压即可,前提是已经安装有 JDK。安装完成后需要配置环境变量:
JAVA_HOME:D:\Program Files\Java\jdk1.8.0_91
MAVEN_HOME:D:\Maven\apache-maven-3.5.0
3. Maven 目录结构介绍
3.1 MAVEN_HOME
bin
boot
conf
lib
LICENSE
NOTICE
README.txt
-
bin
该目录包含了 mvn 运行的脚本,这些脚本用来配置 Java 命令,准备好 classpath 和相关的 Java 系统属性,然后执行 Java 命令。其中 mvn 是基于 UNIX 平台的 shel 脚本,mvn.bat 是基于 Windows 平台的 bat 脚本。在命令行输人任何一条 mvn 命令时,实际上就是在调用这些脚本。该目录还包含了 mvnDebug 和 mvnDebug.bat 两个文件,同样,前者是 UNIX 平台的 shell 脚本,后者是 Windows 平台的 bat 脚本。那么 mvn 和 mvnDebug 有什么区别呢?打开文件我们可以看到,两者基本上是一样的,只是 mvnDebug 多了一条 MAVEN_DEBUG_OPTS 配置,其作用就是在运行 Maven 时开启 debug,以便调试 Maven 本身。此外,该目录还包含 m2.conf 文件,这是 clssworlds 的配置文件,后面会介绍 classworlds。 -
boot
该目录只包含一个文件,以 maven3.5.0 为例,该文件为 plexus-classworlds-2.5.2.jar。plexus-classworlds 是一个类加载器框架,相对于默认的 java 类加载器,它提供了更丰富的语法以方便配置, Maven 使用该框架加载自己的类库。对于一般的 Maven 用户来说,不必关心该文件。 -
conf
该目录包含了一个非常重要的文件 settings.xml。直接修改该文件,就能在机器上全局地定制 Maven 的行为。一般情况下,我们更偏向于复制该文件至 ~/.m2/ 目录下(~表示用户目录),然后修改该文件,在用户范围定制 Maven 的行为。后面将会多次提到 settings.xml,并逐步分析其中的各个元素。 -
lib
该目录包含了所有 Maven 运行时需要的 Java 类库,Maven 本身是分模块开发的,因此用户能看到诸如 maven-core-3.5.0.jar、 maven-model-3.5.0.jar 之类的文件。此外,这里还包含一些 Maven 用用到的第三方依赖,如 commons-cli-1.4.jar。可以说,lib 目录就是真正的 Maven。关于该文件,还有一点值得一提的是,用户可以在这个目录中找到 Maven 内置的超级 POM,这一点在 8.5 节详细解释。 -
其他: LICENSE.txt 记录了 Maven 使用的软件许可证 Apache License Version2.0;NOTICE.txt 记录了 Maven 包含的第三方软件;而 READMIE.txt 则包含了 Maven 的简要介绍,包括安装需求及如何安装的简要指令等。
3.2 ~/.m2
在讲述该小节之前,我们先运行一条简单的命令: mvn help: system。该命令会打印出所有的 Java 系统属性和环境变量,这些信息对我们日常的编程工作很有帮助。这里暂不解释 help:system 涉及的语法,运行这条命令的目的是让 Maven 执行一个真正的任务。我们可以从命令行输出看到 Maven 会下载 maven-help-plugin,包括 pom 文件和 jar 文件。这些文件都被下载到了 Maven 本地仓库中。
默认情况下,.m2 文件夹下放置了 Maven 本地仓库 .m2/repository。所有的 Maven 构件都被存储到该仓库中,以方便重用。可以到 ~/.m2/repository/org/apache/maven/plugins/maven-help-plugins 目录找到刚才下载的 maven-help-plugins 的 pom 文件和 jar 文件。 Maven 根据一套规则来确定任何一个构件在仓库中的位置,这一点在第 6 章交付详细阐述。
默认情况下,~/.m2 目录下除了 repository 仓库之外就没有其他目录和文件了,不过大多数 Maven 用户需要复制 MAVEN_HOME/conf/settings.xml 文件到 ~/.m2/settings.xml。这是条最佳实践,我们将在 3 小节详细解释。
4. 设置 HTTP 代理
有时候你所在的公司基于安全因素考虑,要求你使用通过安全认证的代理访问因特网。这种情况下,就需要为 Maven 配配置 HTTP 代理,才能让它正常访问外部仓库,以下载所需要的资源。首先确认自己无法直接访问公共的的 Maven 中央仓库,直接运行命令 ping repo.maven.org 可以检查网络。如果真的需要代理,先检査一下代理服务器是否畅通。比如现在有一个 IP 地址为 218.14.227.197,端口为 3128 的代理服务,我们可以运行 telnet 218.14.227.197 3128 来检测该地址的该端口是否畅通。如果得到出错信息,需要先获取正确的代理服务信息;
检查完毕之后,编辑 ~/.m2/settings.xml 文件。添加代理配置如下:
<proxy>
<id>my-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>218.14.227.197</host>
<port>3128</port>
<!-- <username>proxyuser</username>
<password>proxypass</password>
<nonProxyHosts>local.net|some.host.com|*.google.com</nonProxyHosts> -->
</proxy>
这段配置十分简单, proxies 下可以有多个 proxy 元素,如果声明了多个 proxy 元素,则默认情况下第一个被激活的 proxy 会生效。这里声明了一个 id 为 my-proxy 的代理, active 的值为 true 表示激活该代理, protocol 表示使用的代理协议,这里是 http。当然,最重要的是指定正确的主机名(host元素)和端口(port元素)。上述 XML 配置中注释掉了 username、password、 nonProxyHosts 几个元素。当代理服务需要认证时,就需要配置 username 和 password。nonProxyHosts 元素用来指定哪些主机名不需要代理,可以使用 "|" 符号来分隔多个主机名。此外,该配置也支持通配符,如 *.google.com 表示所有以 google.com 结尾的域名不需要代理。
5. maven 安装最佳实践
本节介绍一些在安装 Maven 过程中不是必须的,但十分有用的实践。
5.1 设置 MAVEN_OPTS 环境变量
前面介绍 Maven 安装目录时我们了解到,运行 mvn 命令实际上是执行了Java 命令,既然是运行 Java,那么运行 Java 命令可用的参数当然也应该在运行 mvn 命令时可用。这个时候, MAVEN_OPTS 环境变量就能派上用场。
通常需要设置 MAVEN_OPTS 的值为 -Xms128m -Xmx512m,因为 Java 默认的最大可用内存往往不能够满足 Maven 运行的需要,比如在项目较大时,使用 Maven 生成项目站点需要占用大量的内存,如果没有该配置,则很容易得到 java.lang.OutOfMemeoryError。因此,开始就配置该变量是推荐的做法。
关于如何设置环境变量,请参考前面设置 MAVEN_HOME 环境变量的做法,尽量不要直接修改 mvn.bat 或者 mvn 这两个 Maven 执行脚本文件。因为如果修改了脚本文件,升级 Maven 时就不得不再次修改,一来麻烦,二来容易忘记。同理,应该尽可能地不去修改任何 Maven 安装目录下的文件。
5.2 配置用户范围 settings.xml
Maven 用户可以选择配置 $MAVEN_HOME/conf/settings.xml 或者 ~/.m2/settings.xml。前者是全局范围的,而后者是用户范围的。Maven 会先找用户配置,如果找到则以用户配置文件为准,否则使用全局配置文件。
推荐使用用户范围的 settings.xml,主要是为了避免无意识地影响到系统中的其他用户。如果有切实的需求,需要统一系统中所有用户的 settings.xml 配置,当然应该使用全局范围的 settings.xml。
除了影响范围这一因素,配置用户范围 settings.xml 文件还便于 Maven 升级。直接修改 conf 目录下的 settings.xml 会导致 Maven 升级不便,每次升级到新版本的 Maven,都需要复制 settings.xml 文件。如果使用 ~/.m2 目录下的 settings.xml,就不会影响到 Maven 安装文件,升级级时就不需要触动 settings.xml 文件。