文章目录
Maven开发人员熟悉repository的概念,因为默认情况下使用的是repository。Maven格式存储库中二进制组件的主要类型是包含Java字节码的JAR文件。这是由于Maven的Java背景和默认组件类型是JAR这一事实造成的。然而,实际上,在Maven存储库中可以存储什么类型的组件是没有限制的。例如,您可以轻松地将WAR或EAR文件、源archive、Flash库和应用程序、Android archive或应用程序或Ruby库部署到Maven repository。
每个软件组件都由一个称为项目对象模型(Project Object Model, POM)的XML文档描述。该POM包含描述项目的信息,并列出项目的依赖项——二进制软件组件,给定组件的成功编译或执行依赖于这些组件。
当Maven从存储库下载依赖项或插件之类的组件时,它也下载该组件的POM。给定一个组件的POM, Maven就可以下载该组件所需的任何其他组件。
Maven和其他工具(如Ivy或Gradle)与Maven存储库交互以搜索二进制软件组件,对它们管理的项目建模,并从存储库按需检索软件组件。
The Central Repository
将从中央存储库检索组件。它每天为数百万Maven用户提供服务。它是缺省的内置存储库,使用Maven存储库格式,由Sonatype管理。关于中央存储库大小的统计信息可以从https://search.maven.org/stats获得。
中央存储库是基于java的组件的最大存储库。它也可以很容易地从其他构建工具中使用。您可以将中央存储库视为Maven存储库如何操作和如何组装的示例。下面是一些发布库的属性,比如中央存储库
Component Metadata
添加到中央存储库的所有软件组件都需要适当的元数据,包括每个组件的项目对象模型(POM),该模型描述了组件本身以及软件组件可能具有的任何依赖项。
Release Stability
一旦发布到中央存储库,组件和描述该组件的元数据就不会更改。与中央存储库一样,发布存储库的这个属性可以保证依赖于发布的项目在一段时间内是可重复的和稳定的。虽然每天都有新的软件组件发布,但是一旦一个组件在中央存储库中分配了一个版本号,就会有一个严格的政策,反对在发布之后修改软件组件的内容。
Component Security
中央存储库包含密码散列和PGP签名,可用于验证所提供的软件组件的真实性和完整性,并以安全的方式通过HTTPS支持连接。
Performance
中央存储库通过高性能的服务器内容交付网络向全球用户公开。
除了中央存储库之外,还有一些主要的组织,如Red Hat、Oracle或Apache Software foundation,它们维护独立的附加存储库。促进这些可用存储库的最佳实践是安装Nexus Repository Manager OSS或Nexus Repository Manager Pro,并使用它在您自己的网络上代理和缓存内容
Component Coordinates and the Repository Format
组件坐标为组件创建唯一标识符。Maven坐标使用以下值:groupId、artifactId、version和packaging。这组坐标通常被称为GAV坐标,它是组、工件、版本坐标的缩写。GAV坐标标准是Maven管理依赖项能力的基础。该坐标系的四个要素如下:
groupId
组标识符将一组组件分组为一个逻辑组。组的设计通常反映了特定软件组件的生产组织。例如,由Apache software Foundation的Maven项目生成的软件组件可以在groupId org.apache.maven下获得。
artifactId
artifactId是软件组件的标识符,应该是描述性名称。groupId和artifactId的组合必须是特定项目的唯一组合。
version
项目的版本最好遵循语义版本控制的既定约定。例如,如果您的simple-library组件的主要发布版本是1,次要发布版本是2,点发布版本是3,那么您的版本应该是1.2.3。版本也可以有字母数字限定符,它们通常用来表示发布状态。这样的限定词的一个例子是像“1.2.3-BETA”这样的版本,其中BETA标志着一个对软件组件的消费者有意义的测试阶段。
packaging
Maven最初是为了处理JAR文件而创建的,但是Maven存储库完全不知道它所管理的组件的类型。打包可以是描述任何二进制软件格式的任何东西,包括:zip、nar、war、ear、sar和aar。
用于与Maven存储库交互的工具将组件坐标转换为一个URL,该URL对应于Maven存储库中的一个位置。如果Maven之类的工具正在org.apache.commons组中寻找commons-lang JAR的1.2.0版本,则该请求被转换为:
<repoURL>/org/apache/commons/commons-lang/1.2.0/commons-lang-1.2.0.jar
Maven还从以下站点下载commons-lang 1.2.0对应的POM:
<repoURL>/org/apache/commons/commons-lang/1.2.0/commons-lang-1.2.0.pom
这个POM可能包含对其他组件的引用,然后使用相同的URL模式从相同的存储库中检索这些引用。
Release and Snapshot Repositories
Maven存储库存储两种类型的组件:releases and snapshots。
发布库用于稳定的、静态的发布组件。快照存储库是经常更新的存储库,它存储来自不断开发的项目的二进制软件组件。
虽然可以创建同时服务于发布和快照组件的存储库,但存储库通常被分割为服务于不同使用者的发布或快照存储库,并维护用于部署组件的不同标准和过程。与网络之间的区别非常相似,发布存储库被视为生产网络,而快照存储库更像是开发或测试网络。尽管与发布存储库的部署相关的过程和仪式级别更高,但是可以频繁地部署和更改快照组件,而无需考虑稳定性和可重复性问题。
由存储库管理器管理的两种类型的组件是:
Release
发布组件是由特定的、版本化的发布创建的组件。例如,考虑存储在中央存储库中的commons-lang库的1.2.0版本。这个发布组件,commons-lang-1.2.0。jar和相关的POM, commons-lang-1.2.0。pom是在中央存储库中永远不会更改的静态对象。发布的组件被认为是可靠的、稳定的和永久的,以保证依赖于它们的构建随着时间的推移是可重复的。发布的JAR组件与一个PGP签名、一个MD5和一个SHA校验和相关联,该校验和可用于验证二进制软件组件的真实性和完整性。
Snapshot
快照组件是在软件项目开发过程中生成的组件。快照组件的名称中既有版本号(如1.3.0或1.3),也有时间戳。例如,commons-lang 1.3.0的快照组件的名称可能是commons-lang-1.3.0.-20090314.182342-1.jar关联的POM、MD5和SHA散列也有类似的名称。为了在软件组件的开发过程中促进协作,Maven和其他知道如何从存储库中使用快照组件的客户机还知道如何查询与快照组件相关联的元数据,以便从存储库中检索快照依赖项的最新版本。
处于活动开发中的项目生成随时间变化的快照组件。一个版本由一些组件组成,这些组件将随着时间的推移而保持不变。
通过查看Maven存储库格式以及相关的概念和思想,您可以掌握涉及不同工具和存储库格式的一些细节和复杂性,这将帮助您了解对存储库管理的需求。