6.3 仓库的分类

对于Maven来说,仓库只分为两类:本地仓库和远程仓库。当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有需要的构件,Maven就会报错。

在这个最基本分类的基础上,还有必要介绍一些特殊的远程仓库。中央仓库是Maven核心自带的远程仓库,它包含了绝大部分开源的构件。在默认配置下,当本地仓库没有Maven需要的构件的时候,它就会尝试从中央仓库下载。

私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。

除了中央仓库和私服,还有很多其他公开的远程仓库,常见的有Java.net Maven库(http://download.java.net/maven/2/)和JBoss Maven库(http://repository.jboss.com/maven2/)等。

Maven仓库的分类见图6-1。

6.3 仓库的分类 - 图1

图 6-1 Maven仓库的分类

6.3.1 本地仓库

一般来说,在Maven项目目录下,没有诸如lib/这样用来存放依赖文件的目录。当Maven在执行编译或测试时,如果需要使用依赖文件,它总是基于坐标使用本地仓库的依赖文件。

默认情况下,不管是在Windows还是Linux上,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。例如,笔者的用户名是juven,我在Windows机器上的本地仓库地址为C:\Users\juven.m2\repository\,而我在Linux上的本地仓库地址为/home/juven/.m2/repository/。注意,在Linux系统中,以点(.)开头的文件或目录默认是隐藏的,可以使用ls-a命令显示隐藏文件或目录。

有时候,因为某些原因(例如C盘空间不够),用户会想要自定义本地仓库目录地址。这时,可以编辑文件~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。例如:


<settings>

<localRepository>D:\java\repository\</localRepository>

</settings>


这样,该用户的本地仓库地址就被设置成了D:\java\repository\。

需要注意的是,默认情况下,~/.m2/settings.xml文件是不存在的,用户需要从Maven安装目录复制$M2_HOME/conf/settings.xml文件再进行编辑。本书始终推荐大家不要直接修改全局目录的settings.xml文件,具体原因已在第2.7.2节中阐述。

一个构件只有在本地仓库中之后,才能由其他Maven项目使用,那么构件如何进入到本地仓库中呢?最常见的是依赖Maven从远程仓库下载到本地仓库中。还有一种常见的情况是,将本地项目的构件安装到Maven仓库中。例如,本地有两个项目A和B,两者都无法从远程仓库获得,而同时A又依赖于B,为了能构建A,B就必须首先得以构建并安装到本地仓库中。

在某个项目中执行mvn clean install命令,就能看到如下输出:


[INFO] [jar:jar {execution: default-jar}]

[INFO] Building jar: D:\git-juven \maven-book \code \ch-5 \account-email \target

\account-email-1.0.0-SNAPSHOT.jar

[INFO] [install:install {execution: default-install}]

[INFO] Installing D:\git-juven\maven-book\code\ch-5 \account-email\target\account-

email-1.0.0-SNAPSHOT.jar to D:\java\repository\com\juven\mvnbook \account \

account-email\1.0.0-SNAPSHOT\account-email-1.0.0-SNAPSHOT.jar

[INFO] ---------------------------------------------------------

[INFO] BUILD SUCCESSFUL

[INFO] ---------------------------------------------------------


Install插件的install目标将项目的构建输出文件安装到本地仓库。在上述输出中,构建输出文件是account-email-1.0.0-SNAPSHOT.jar,本地仓库地址是D:\java\repository,Maven。

使用Install插件将该文件复制到本地仓库中,具体的路径根据坐标计算获得。计算逻辑请参考6.2节。