走进Maven之概念篇
一、 什么是 Maven
Maven 项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告、文档的软件项目管理工具。
Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的
缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用Maven,而且公司项目采用 Maven 的比例在持续增长。
Maven 这个单词来自于意第绪语(犹太语),意为知识的积累,最初在 Jakata Turbine 项目中用来简化构建过程。当时有一些项目(有各自 Ant build 文件),仅有细微的差别,而 JAR文件都由 CVS 来维护。于是希望有一种标准化的方式构建项目,一个清晰的方式定义项目的组成,一个容易的方式发布项目的信息,以及一种简单的方式在多个项目中共享 JARs。
二、Maven 和 ANT 的区别
那么,Maven 和 Ant 有什么不同呢?在回答这个问题以前,首先要强调一点:
Maven 和 Ant 针对构建问题的两个不同方面。
Ant 为 Java 技术开发项目提供跨平台构建任务。
Maven本身描述项目的高级方面,它从 Ant 借用了绝大多数构建任务。
因此,由于 Maven 和 Ant 代表两个差异很大的工具,所以接下来只说明这两个工具的等同组件之间的区别,如表所示。
![](https://img.haomeiwen.com/i7383277/e9bd0653005889aa.png)
Maven 是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven 的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
此外, Maven 能够很方便的帮你管理项目报告,生成站点,管理 JAR 文件,等等。
三、Maven 仓库是什么
Maven 仓库是基于简单文件系统存储的, 集中化管理 Java API 资源(构件)的一个服务。仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径。 得益于 Maven 的坐标机制,任何 Maven 项目使用任何一个构件的方式都是完全相同的, Maven 可以在某个位置统一存储所有的 Maven 项目共享的构件,这个统一的位置就是仓库,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其它项目使用。
对于 Maven 来说,仓库分为两类:本地仓库和远程仓库。
远程仓库:
远程仓库指通过各种协议如 file://和 http://访问的其它类型的仓库。这些仓库可能是第三方搭建的真实的远程仓库,用来提供他们的构件下载(例如repo.maven.apache.org 和uk.maven.org 是 Maven 的中央仓库)。其它“远程”仓库可能是你的公司拥有的建立在文件或 HTTP 服务器上的内部仓库,用来在开发团队间共享私有构件和管理发布的。
本地仓库:
本地仓库指本机的一份拷贝,用来缓存远程下载, 包含你尚未发布的临时构件。
四、仓库配置
Maven 官方网站: http://maven.apache.org/
Maven 工程中的默认仓库为 Apache 提供的中央仓库(repo.maven.apache.org)。 中央仓库的信息在超级 Pom 中配置,所有的 maven 项目都会继承超级 POM。
超级 POM 的位置:
$M2_HOME/lib/maven-model-builder-3.0.jar
然后访问路径:
org/apache/maven/model/pom-4.0.0.xml
可以看到配置:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
在 settings.xml 文件中配置本地仓库:
地仓库是开发者本地电脑中的一个目录,用于缓存从远程仓库下载的构件。
默认的本地仓库是${user.home}/.m2/repository
。
用户可使用 settings.xml 文件修改本地仓库。
具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<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>/put/your/local/repository/here</localRepository>
<!-- 省略,具体信息参考后续内容。 -->
</settings>
在 settings.xml 文件中配置镜像仓库:
如果仓库 A 可以提供仓库 B 存储的所有内容,那么就可以认为 A 是 B 的一个镜像。
例如:在国内直接连接中央仓库下载依赖,由于一些特殊原因下载速度非常慢。
这时,我们可以使用阿里云提供的镜像:
http://maven.aliyun.com/nexus/content/groups/public/
来替换中央仓库:
http://repol.maven.org/maven2/
修改 maven 的 setting.xml 文件,具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<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>${user.home}/.m2/repository</localRepository>
-->
<pluginGroups>
<pluginGroup>org.mortbay.jetty</pluginGroup>
<pluginGroup>org.jenkins-ci.tools</pluginGroup>
</pluginGroups>
<proxies>
</proxies>
<servers>
</servers>
<!-- 镜像仓库配置 -->
<mirrors>
<!-- 配置具体镜像仓库 -->
<mirror>
<!-- 指定镜像 ID -->
<id>alimaven</id>
<!-- 指定镜像名称 -->
<name>aliyun maven</name>
<!-- 指定镜像路径 -->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!-- 指定此镜像替代中央仓库
<mirrorOf>central</mirrorOf> : 匹配中央仓库。
<mirrorOf>*</mirrorOf> :匹配所有远程仓库。
<mirrorOf>repo1,repo2</mirrorOf> :匹配仓库 repo1,repo2,多个使用逗号分隔。
<mirrorOf>*,!repo1</mirrorOf> :匹配所有远程仓库, repo1 除外。
-->
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
</profiles>
</settings>
在 pom.xml 文件中指定远程仓库:
如果默认的中央仓库无法满足项目需求,可能需要的构件在另外一个远程仓库,如 JBoss Maven 仓库,可以 POM 中配置该仓库。
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<repositories>
<repository>
<!-- 仓库 id,注意 id 要唯一,如果出现重复会覆盖掉之前的 -->
<id>jboss</id>
<!-- 仓库名称 -->
<name>JBoss Repository</name>
<!-- 仓库地址 -->
<url>https://repository.jboss.com/maven2/</url>
<!-- 仓库布局方式为默认 -->
<layout>default</layout>
<!-- 是否从此仓库下载快照版本资源 -->
<snapshots>
<enabled>false</enabled>
</snapshots>
<!-- 是否从此仓库下载发布版本资源 -->
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
</project>
远程仓库的认证
有时候处于安全考虑,需要提供认证信息才能访问一些远程仓库。为了能让 maven 访问仓库内容,就需要配置认证信息,认证信息的配置不会在 pom.xml 配置,而是在 settings.xml中配置,因为 pom 会被提交到代码仓库中供所有成员访问,而 settings.xml 一般只放在本机。(此配置常用于私服应用,后续会有详细讲解) 假设我在 pom.xml 中配置 id=my-proj 的远程仓库,需要认证信息,则在 settings.xml 中配置如下:
<settings>
...
<servers>
<server>
<id>my-proj</id>
<username>repo-user</username>
<password>repo-pwd</password>
</server>
</servers>
...
</settings>
这里的 id=my-proj 一定要和 pom.xml 中仓库的 id 一致,这是它们之间唯一的联系。
settings.xml 的 servers 中就是用来配服务器授权信息的,当然不仅可以配置仓库服务器认证信息,还可以配置其它的比如 tomcat 服务器授权信息也可以在这里配置。
五、仓库优先级问题
本地仓库,镜像仓库,中央仓库, pom 文件中指定的远程仓库。
镜像仓库=中央仓库。 镜像仓库是用于替代中央仓库的。
仓库访问优先级:
本地仓库
第一访问本地仓库。
指定仓库
如果本地仓库不存在对应信息,访问 pom 文件中指定的远程仓库。
这个远程仓库是第二优先级。
远程仓库
- 镜像仓库:
镜像仓库是 Maven 开发过程中的首选远程仓库,在本地仓库和指定仓库无法获取资源的时候,直接访问镜像仓库。 - 中央仓库:
如果镜像仓库不是中央仓库,则会在访问镜像仓库无法获取资源后,访问中央仓库。