Artifact Repositories
在maven中, repository 用来存储构建工程和各种依赖.
严格上来说, 只有两种类型的仓库: 本地和远程. 本地仓库是指在你自己的机器上缓存远程的下载, 同时也包含了你还没有发布的临时构建.
远程仓库指任意其他类型的仓库, 可以通过多种协议来访问, 比如 file:// 和 http:// . 这些仓库可能是一个真正的远程仓库, 由第三方建立来支持下载他们的工程. 例如, repo.maven.apache.org 和 uk.maven.org 提供了maven的中心仓库. 其他远程仓库可能是内部仓库, 你的公司在一个文件或HTTP服务器上创建的, 用来在开发团队之间共享和发布私有的工程.
本地和远程仓库以相同的方式组织. 所以脚本可以很轻松地在其他地方进行. 也可以同步用于离线使用. 通常的使用过程中, 仓库的布局对用户来说是透明的.
Why not Store JARs in CVS?
CVS, Version Control System. 版本控制系统. 用来记录源文件的历史信息,甚至二进制文件,媒体文件等. CVS可以协助一组人共同开发一个工程, 为文件冲突\合并提供了解决方案. (代码统一管理, 冲突解决方案, 代码权限管理, 版本发布和分支)
不推荐把你的JAR文件存储到CVS中. Maven尝试推广这样一个概念: 一个用户的本地仓库, 存储的JAR文件或任意其他工程, 能够被任意数目的构建共用. 很多工程的一些依赖, 比如xml解析器, 以及一些标准工具, 经常在典型构建中复用. 使用maven, 这些标准工具就可以存储在你的本地仓库中, 并且被任意数目的构建共享.
优势如下:
- It uses less storage – 当一个仓库非常大时, 由于每个JAR都只保存在一个地方, 它实际上节省了空间, 即使它可能看起来不是这样.
- It makes checking out a project quicker – 初始校验, 然后小幅度更新. 如果没有很大的二进制文件存在于CVS中, 一个工程的速度会更快. 当他们需要重新下载时, 只会发生一次, 而且不需要下载一些已经存在的共用JAR.
- No need for versioning – CVS和其他源码控制系统是为版本文件设计的, 但外部依赖一般不会改变. 或者, 他们为了明示新版本而以各种方式修改文件命名. 把它们存储在CVS不会比保存在一个本地缓冲区中更有益.
Using Repositories
通常, 你应该不需要定期对一个本地仓库做什么事情. 除了在你缺乏硬盘空间时清理它, 或完全擦除它, 如果你想重新下载所有东西的话. 而对于远程仓库, 他们可以供你下载和上传.
Downloading from a Remote Repository
maven中的下载发生在: 一个工程声明了一个本地仓库中不存在的依赖, 或者对于一个快照snapshot, 当远程仓库包含了一个新版本时.
默认情况下, maven会从中央存储库下载.
为了避免这样, 你需要指定一个镜像, http://maven.apache.org/guides/mini/guide-mirror-settings.html
你可以在你的setting.xml文件中设置使用一个特定的镜像, 但注意通常一个工程会在它们的pom.xml中自定义库, 而你的settings会优先. 如果你发现依赖无法被发现, 检查你是否覆盖了远程仓库.
Using Mirrors for the Central Repository
有很多分布在不同地理位置的官方中央仓库. 你可修改你的settings.xml文件, 使用一个或多个镜像.
Building Offline
如果你需要离线构建你的工程, 你可以在命令窗口使用以下离线开关:
- mvn -o package
注意, 很多插件会支持这个离线设置, 而不执行需要连接网络的其他操作. 例如, 解决javadoc链接和链接检查网站.
Uploading to a Remote Repository
上传是任意类型的远程仓库都支持的, 但你必须拥有权限. 为了能够上传到中央仓库, 参考http://maven.apache.org/repository/index.html
Internal Repositories
当使用maven时, 尤其是在一个协作环境中, 考虑到安全\速度或带宽问题, 连接到互联网来下载依赖不太合适. 因此, 建立一个内部仓库来存储构件复本\发布私有构件就十分重要.
这样一个内部仓库可以通过使用HTTP或文件系统的方式来下载, 或使用SCP, FTP或文件复制等方式来上传.
注意, 这个仓库没有什么特殊之处: 它是另一个远程仓库.
另外, 你可能想和你生成的项目站点共享这个仓库服务器, 生成和发布站点, 参考http://maven.apache.org/guides/mini/guide-site.html
Setting up the Internal Repository
建立一个内部仓库,只要求你有足够的空间来存放它, 然后开始从远程仓库, 比如repo.maven.apache.org, 使用相同的布局来复制需要的构件,.
不推荐你抓取或 rsync:// 一个完整的复本, 因为有大量的数据, 这样做将会导致你被禁. 你可以使用一个程序, 比如网页http://maven.apache.org/repository-management.html 中给出的, 来运行你的内部仓库服务, 从互联网中按需下哉, 然后存储这些构件在你的内部仓库中.
另一个选择是手动下载和发布, 然后复制到内部仓库中, 或让maven为一个用户下载它们, 并且手动上传新版本构件到内部仓库. 这个步骤只可用于许可证禁止自动发布的构件, 比如sun提供的通用J2EE JARs. 参考http://maven.apache.org/guides/mini/guide-coping-with-sun-jars.html
Using the Internal Repository
使用内部仓库非常简单. 只需增加一个 repositories 元素.
如果你的内部仓库要求认证, id元素可用在你的settings 文件中指定登录信息.
Deploying to the Internal Repository
使用一个或多个内部仓库的最重要原因之一, 是能够发布你自己的私有版本.
为了发布到仓库中, 你需要通过 SCP, SFTP, FTP , WebDAV, 或者文件系统. 连接是通过各种各样的轮子完成了, 为了扩展你的构建, 可能需要添加一些轮子. 哈哈….
Reference
http://maven.apache.org/guides/introduction/introduction-to-repositories.html
http://maven.apache.org/guides/mini/guide-mirror-settings.html