1、 仓库的分类
对于Maven来说,仓库只分为两类:本地仓库和远程仓库。当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有需要的构件,Maven就会报错。
在这个最基本分类的基础上,还有必要介绍一些特殊的远程仓库。中央仓库是Maven核心自带的远程仓库,它包含了绝大部分开源的构件。在默认配置下,当本地仓库没有Maven需要的构件的时候,它就会尝试从中央仓库下载。
私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。
除了中央仓库和私服,还有很多其他公开的远程仓库,常见的有Java.net.Maven库(http://download.java.net/maven/2/)和JBoss Maven(http://repository.jboss.com/maven2/)等。
Maven仓库的分类见下图:
A、 本地仓库
修改本地仓库目录地址
#/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。例如:
<settings>
<localRepository>D:\java\repository\</localRepository>
<settings>
需要注意的是,默认情况下#/.m2/settings.xml文件是不存在的,用户需要从Maven安装目录复制$M2_HOME/conf/settings.xml文件再进行编辑。
安装好Maven后,如果不执行任何Maven命令,本地仓库目录是不存在的。当用户输入第一条Maven命令之后,Maven才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件至本地仓库。
B、中央仓库
由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。中央仓库就是这样一个默认的远程仓库,Maven的安装文件自带了中央仓库的配置。读者可以使用解压工具打开$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>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
包含这段配置的文件是所有Maven项目都会继承的超级POM,稍后的章节会详细介绍继承及超级POM
C、私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。
本地私服的好处:节省自己的外网带宽;加速Maven构建;部署第三方构件;提高稳定性,增强控制;降低中央仓库的负荷。
1、 远程仓库的配置
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
任何仓库声明的id必须是唯一的,尤其需要注意的是,Maven自带的中央仓库使用的id为central,如果其他的仓库声明也使用该id,就会覆盖中央仓库的配置。该配置中的url值指向了仓库的地址,一般来说,该地址都基于http协议,Maven用户都可以在浏览器中打开仓库地址浏览构件。
该例配置中的releases和snapshots元素比较重要,它们用来控制Maven对于发布版构件和快照版构件的下载。该例中release的enabled值为true,表示开启JBoss仓库的发布版本下载支持,而snapshots的enabled值为false,表示关闭JBoss仓库的快照版本的下载支持。因此,根据该配置,Maven只会从JBoss仓库下载发布版本的构件,而不会下载快照版本的构件。
对于releases和snapshots来说,除了enabled,它们还包含另外两个子元素updatePolicy和checksumPolicy
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
元素updatePolicy用来配置Maven从远程仓库检查更新的频率,默认的值是daily,表示Maven每天检查一次。其他可用的值包括:never-从不更新;always-每次构建都检查更新;interval:X –每隔X分钟检查一次更新。
元素checksumPolicy用来配置Maven检查检验和文件的策略。当构件被部署到Maven仓库中时,会同时部署对应的检验和文件。在下载构件的时候,Maven会验证校验和文件,如果检验和验证失败,怎么办?当checksumPolicy的值为默认的warn时,Maven会在执行构建时输出警告信息,其他可用的值包括:fail-Maven遇到检验和错误就让构建失败;ignore-使Maven完全忽略检验和错误。
A、 远程仓库的认证
配置认证信息和配置仓库信息不同,仓库信息可以直接配置POM文件中,但是认证信息必须配置在settings.xml文件中。这是因为POM往往是被提交到代码仓库中供所有成员访问的,而settings.xml一般只放在本机。因此,在settings.xml中配置认证信息更为安全。
<settings>
…
<servers>
<server>
<id>my-proj</id>
<username>repo-user</ username>
<password> repo-pwd</ password>
</server>
</servers>
</settings>
其中,id元素必须与POM中需要认证的repository元素的id完全一致。
B、 部署至远程仓库
<project>
...
<distributionManagement>
<repository>
<id>proj-releases</id>
<name>Proj Release Repository</name>
<url>http://192.168.1.100/content/repositories/proj-releases</url>
</repository>
<snapshotRepository>
<id>proj-snapshots</id>
<name>Proj SnapshotRepository</name>
<url>http://192.168.1.100/content/repositories/proj-snapshots</url>
</snapshotRepository>
</distributionManagement>
...
</project>
distributionManagement包含repository和snapshotRepository子元素,前者表示发布版本构件的仓库,后者表示快照版本的仓库。这两个元素下都要配置id、name、url,id为该仓库的唯一标识,name是为了方便人阅读,关键的url表示该仓库的地址。
配置正确后,在命令行运行mvn clean deploy,Maven就会将项目构件输出的构件部署到配置对应的远程仓库,如果项目当前的版本是快照版本,则部署到快照版本仓库地址,否则就部署到发布版本仓库地址。
2、 镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取。
<settings>
<mirrors>
<mirror>
<id>ender</id>
<name>ender</name>
<url>http://218.56.10.110:8081/nexus/content/groups/public </url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
该例中<mirrorOf>的值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,用户也可以使用同样的方法配置其他仓库的镜像。此例为配置中央仓库镜像。
如何配置私服作为镜像呢?
<settings>
<mirrors>
<mirror>
<id>internal-repository</id>
<name>Internal Repository Manager</name>
<url>http://192.168.1.100/maven2 </url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
</settings>
该例中<mirrorOf>的值为星号,表示该配置是所有Maven仓库的镜像,任何对于远程仓库的请求都会被转至http://192.168.1.100/maven2/。
为了满足一些复杂的需求,Maven还支持更高级的镜像配置:
<mirrorOf>*</mirrorOf>:匹配所有远程仓库。
<mirrorOf>external:*</mirrorOf>:匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。
<mirrorOf>repo1,repo2</mirrorOf>:匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。
<mirrorOf>*,!repo1</mirrorOf>:匹配所有远程仓库,repo1除外。
需要注意的是,由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,maven仍将无法访问被镜像仓库,因而将无法下载构件。
3、 仓库搜索服务
使用Maven进行日常开发时,一个常见的问题就是如何寻找需要的依赖,我们可能只知道需要使用类库的项目名称,但是添加maven依赖要求提供确切的maven坐标。这时就可以使用仓库搜索服务来根据关键字得到Maven坐标。在此介绍几个常用的、功能强大的公共maven仓库搜索服务。
A、 Sonatype Nexus
地址:http://repository.sonatype.org
Nexus是当前最流行的开源Maven仓库管理软件。
B、 MVNrepository