Maven仓库是为了储存和管理Maven构件(如:Maven依赖和Maven插件)。因为仓库是储存Maven构件的,而任何一个构件都有一个唯一的坐标,这个坐标就可以定义其在仓库中的唯一存储路径。我们通过本地仓库,隐隐约约可以知道仓库路径大致是groupId/artifactId/version/artifactId-version.package。而我们在Maven源码中也证实了其存储的路径。
第一、仓库分类
仓库大致分为两类,本地仓库和远程仓库。当Maven根据构件坐标寻找构件时,首先查找本地仓库,如果本地仓库存在构件,则直接使用(更改classpath);如果本地仓库不存在,则需要在远程仓库中查找,并下载到本地仓库;如果本地仓库和远程仓库都没有,Maven会报错。其实Maven远程仓库还有一类特殊的仓库——私服。我们在项目开发之前,有必要在局域网创建一个私服,用途:1、代理所有外部的远程仓库;2、内部项目可以部署到私服;3、有时可避免没有外网的情况。仓库分类如下图:
1.1 本地仓库
默认情况下,每个用户在自己的用户目录下都有一个.m2/repository/的仓库目录。不过,很多时候,我们都不想在C盘储存太多的内容,这时,我们需要编辑~/.m2/setting.xml,设置如下:
<settings>
<localRepository>E:/jars</localRepository>
</settings>
这样,用户的本地仓库目录就变成了E:/jars了。
构件必须存放在本地仓库后,才能供其他Maven项目使用。例如:A依赖B,而A和B都不能通过远程仓库获取,这时为了构件A,就得将B构建并安装到本地仓库。命令:mvn clean install。
1.2 中央仓库
Maven内置了一个远程仓库,我们称其为中央仓库。我们在maven-model-builder-3.0.5.jar的org\apache\maven\model\pom-4.0.0.xml中,我们可以看到如下配置:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
所有Maven的pom都是从这个pom继承。
1.3 私服
私服其实是本地仓库和远程仓库之间的一个桥梁。通过它,我们可以获取以下好处:
a、节省自己的外网宽带;
b、加速Maven构建(本地构建当然比远程构建快了);
c、可以部署第三方构件(如oracle的jdbc驱动包,由于许可证的缘故,不能从中央仓库获取);
d、提高稳定下(在没有外网的情况下);
e、降低中央仓库负荷。
第二、配置远程仓库
要想在项目中配置远程仓库,只需要在project节点下配置如下:
<repositories>
<repository>
<id>other-repo</id>
<name>Other Repository</name>
<url>http://other.org/maven2</url>
<layout>default</layout>
<release>
<enabled>true</enabled>
</release
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
当然,release和snapshots节点下还可以配置其他元素节点,在此不细说。
1、远程仓库认证,只需要认证用户名和密码,我们再settings.xml中配置上即可,如下图:
<servers>
<server>
<id>other-repo</id>
<username>repo-user</username>
<password>repo-pass</password>
</server>
</servers>
2、部署到远程仓库,配置如下:
<distributionManagement>
<repository>
<id>proj-r</id>
<name>proj release</name>
<url>...</url>
</repository>
<snapshotRepository>
<id>proj-r</id>
<name>proj release</name>
<url>...</url>
</snapshotRepository>
</distributionManagement>
我们通过命令mvn clean deploy,就可以将项目构件部署到远程仓库。这儿的关键在于url和id的配置。
第三、仓库解析机制
我们知道,当本地仓库没有构件时,Maven会从远程仓库下载;当依赖版本为快照的时候,Maven会下载最新的快照。我们总结步骤如下:
a、依赖范围为system,直接从本地解析;
b、根据仓库坐标计算规则,尝试从本地解析构件,如果解析成功,则终止;
c、本地解析失败,如果依赖是发布版本,则依次遍历所有远程仓库,发现后,下载并解析,则终止;
d、如果依赖为快照版本(snapshot),则取最新快照版本。
第四、私服管理软件
我们使用Sonatype Nexus。后面我们会详细介绍这个软件的配置,以及如何使用。