Maven中的仓库用来存放生成的构建和各种依赖。严格说来只有两种仓库:本地和远程。本地仓库指本机的一份拷贝,用来缓存远程下载、包含你尚未发布的临时构件。
远程仓库指通过各种协议如file://和http://访问的其它类型的仓库。这些仓库可能是第三方搭建的真实的远程仓库,用来提供他们的构件下载(例如 repo.maven.apache.org 和 uk.maven.org 是Maven的中央仓库)。其它“远程”仓库可能是你的公司拥有的建立在文件或HTTP服务器上的内部仓库,用来在开发团队间共享私有构件和管理发布。
本地和远程仓库有着相同的结构,所以脚本可以很容易地在两边运行,或同步仓库供离线使用。不过,一般情况下,仓库内部的布局对Maven用户是完全透明的。
不推荐将jar存储到CVS。Maven强调用户本地仓库的概念,在本地仓库中jar或其它任何工程构件可以被存储和任意构建使用。许多工程依赖共同的组件如XML解析器和标准实用工具等,典型的构建中这些会重复复制,使用Maven这些标准组件可以在本机存储并被任意构建共享使用。
这样做有以下优点:
一般来说,对本地仓库什么都不用做,除非磁盘空间不足而删除它(或完全清除以重新下载全部)。
远程仓库用来下载或上传(如果有权限)。
工程声明了一个本地仓库中没有的依赖时会触发下载(或者对SNAPSHOT,如果远程仓库包含新版本时)。Maven默认从 中央 仓库下载依赖。
要覆盖这一设置,你需要指定镜像,参见 Using Mirrors for Repositories 。
可以在settings.xml中设置全局镜像,但要注意在工程的pom.xml中指定仓库也是普遍的,settings.xml的设置会优先生效。如果找不到依赖,检查是否覆盖了远程仓库。
更多关于依赖的信息,参考 Dependency Mechanism 。
官方仓库有数个位于不同地理位置的分布。可以修改settings.xml使用一个或多个镜像。操作指南参见 Using Mirrors for Repositories 。
如果你暂时从互联网断开了,仍需要构建工程,可以在命令行中使用离线开关:
mvn -o package
许多插件会判断离线设置而不去连接互联网,比如解析Javadoc链接和网站的链接检查。
可能所有的远程仓库都要求必须有权限才能上传。若要上传到中央仓库,参考 Repository Center 。
使用Maven,尤其是在一家公司内,出于安全、速度或带宽的原因,连接到互联网来下载依赖可能是不能接受的。此时,建立一个内部仓库来存放构件的拷贝和发布私有构件是明智的。从内部仓库下载可以使用HTTP或文件系统(使用file://),上传可以使用scp, ftp或文件拷贝。
注意只要是在Maven中,内部仓库没有任何特殊之处:它是另一种远程仓库,包含可下载到用户本地存储的构件,同时是构件发布的目的地。
此外,你可能想将生成的工程站点共享到仓库,更多创建和部署站点的信息,参考 Creating a Site 。
搭建内部仓库只需要找一台服务器存放它,然后拷贝需要的构件,使用与远程仓库如 repo.maven.apache.org 同样的目录结构。
不推荐抓取或用rsync获取整个中央仓库的完整拷贝,数据量太大,而且这样做会被禁。你可以使用 Repository Management 中介绍的程序来运行内部仓库服务,从互联网按需下载并保存构件来提供更快的内部下载。
另一种选择是手动下载和检查发布包,拷贝到内部仓库,或通过Maven下载之后手动上传确认过的构件到用作发布的内部仓库。这一操作对禁止自动分发的构件是唯一可行的方式,如Sun提供的J2EE jar包。查看 Guide to coping with SUN JARs 了解更多。
值得一提的是,Maven未来计划包含对这些特性的增强支持,包括下载时自动点击许可和签名验证。
使用内部仓库很简单,增加一个repositories元素:
<project> ... <repositories> <repository> <id>my-internal-site</id> <url>http://myserver/repo</url> </repository> </repositories> ... </project>
如果你的内部仓库需要认证,在 settings 文件中使用id元素指定登录信息。
使用内部仓库的最重要原因之一是将自己的私有包发布出来共享。
要发布到仓库,你需要通过SCP,SFTP,FTP,WebDAV或文件系统之一访问仓库。连接通过各种 wagons 实现,有些wagon可能需要在构建中加入 扩展 。