bboyjing's blog

Maven学习笔记五【Repositories】

本节来学习下Maven的存储库。

介绍存储库

构件库

Maven中的存储库用于保存不同类型的构建项目和依赖关系。

严格来讲,只有两种类型的存储库:本地存储库和远程存储。本地存储库指向本地的一个副本,该副本是远程下载的缓存,并且还包含尚未发布的临时构建项目。

远程库指的是任何其他类型的存储库,可以通过各种协议访问如file://和http:// 。这些存储库可能是由第三方简历的真正远程存储库,以提供可以下载的项目(例如Maven中央存储库)。其它“远程”存储库可能是在公司内的文件或HTTP服务器上简历的内部存储库,用于在开发团队和版本之间共享私有项目。

本地存储库和远程存储库的结构是相同的,因此脚本可以轻松地在任意一方运行,或者可以同步以便脱机使用。但是,一般情况下,存储库的布局对Maven用户是完全透明的。

使用存储库

一般来说,不需要经常使用本地存储库做任何事情,除非在磁盘空间不足时清理它(或者如果愿意再次下载所有内容,则完全删除它)。

对于远程存储库,它们用于下载和上传(如果有权限的话)。

从远程库下载

Maven中的下载由声明本地存储库中不存在的依赖项的项目触发(或者对于SNAPSHOT,当远程存储库包含更新的依赖项时)。默认情况下,Maven将从中央存储库下载。

要覆盖它,需要指定镜像,下面会具体说明。

可以在settings.xml中将其设置为全局使用某个镜像,但是请注意,项目通常会在pom.xml中自定义存储库,并且settings.xml中的设置将优先处理。如果发现没有找到依赖项,请检查是否覆盖了远程存储库。

使用中央存储库镜像

有几个在地理上分布的官方中央存储库。我们可以更改settings.xml来使用一个或多个镜像。

离线构建

如果暂时与网络断开连接,需要脱机构建项目,可以使用CLI的offline开关:

1
mvn -o package

注意:许多插件都支持离线设置,不会执行任何链接到网络的操作。比如,解析Javadoc链接和site链接检查。

上传到远程存储库

虽然这对于任何类型的远程存储库都是可能得,但是必须拥有权限才行。

内部存储库

在使用Maven时,特别是在企业环境中,由于安全性、速度或带宽等原因,连接到网络下载依赖项是不可接受的。出于这个原因,最好简历一个内部存储库来存放项目的副本,并将私有项目发布到其中。

这样的内部存储库可以使用HTTP或文件系统(比如file:// URL),并使用SCP、FTP或文件副本上传。

注意,就Maven而言,这个存储库没有什么特别之处:它是另一个远程存储库,其中包含要下载到本地缓存的项目,并且是项目发布的目的地。

此外,我们可能希望与生成的项目站点共享存储服务器,具体的后面再讲。

设置内部存储库

要设置一个内部存储库,只需要有一个放置它的地方,然后使用与远程库(如epo.maven.apache.org)相同的布局开始复制所需的项目。

不建议抓取或rsync://中央服务器的完整副本,因为那里有大量的数据,这样做会被服务器禁止访问。可以使用存储库管理页面中描述的程序来运行内部存储库的服务器,根据需要从网络下载,然后将项目保存在内部存储库中,以便稍候更快地下载。

其他可用的选项是手动下载和审查版本,然后将它们复制到内部存储库,或者让Maven为用户户下载他们,然后手动将审查过的项目上传到用于发布的内部存储库。此步骤是唯一可用于许可证禁止自动分发项目的方式,例如Sun提供的几个J2EEjar包。

应该注意的是, Maven打算在将来支持这些特性,包括在下载时单击许可证和验证签名。

使用内部存储库

使用内部存储库非常简单,添加如下更改就可以了:

1
2
3
4
5
6
7
8
9
10
<project>
...
<repositories>
<repository>
<id>my-internal-site</id>
<url>http://myserver/repo</url>
</repository>
</repositories>
...
</project>

如果内部存储库需要身份验证,可以在settings.xml中使用id元素来指定登陆信息。

部署到内部存储库

拥有一个或多个内部存储库的重要原因之一是能够分享我们自己的私有项目。要发布到存储库,需要通过SCP、SFTP、FTP、WebDAV或文件系统之一进行访问。连接是通过各种包装实现的。能需要添加一些工具作为构建的扩展。