maven仓库简介
1. 什么是Maven
Maven是一个基于项目对象模型(POM)的项目管理工具。所有的Maven项目都会包含一个pom.xml的文件,里面通过一些字段标识坐标和依赖,即其他项目如何找到我和我都依赖什么项目,一个常见的pom.xml文件结构如下:
<project xmlns="http://maven.apache.org/POM/4.0.0"
<groupId>com.yiibai.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
<project>
一个pom文件必须包含groupId、artifactId、version三个字段,这个三个字段就可以构成项目的坐标,常见节点含义如下:
节点 | 描述 |
---|---|
groupId | 项目组编号,通常以公司域名倒序,例如com.sina.mobile,通常这个组织是独一无二的 |
artifactId | 项目编号,主要用来描述当前项目 |
version | 当前项目的版本号 |
dependency | 当前项目依赖的其他项目 |
我们在github上找到gson,它的文档里写了引用gson的方法如下,我们可以发现就是通过这三个节点来定位到gson库的。
2. Maven Central和jcenter
一个Maven项目构建后的输出或者所依赖的,我们可以称作构件或者库,集中存储这些构件的地方叫做Maven仓库。Maven仓库分为本地仓库和远程仓库,当Maven使用一个构建时,先在本地仓库中寻找,如果找不到,再去远程仓库寻找。
- 本地仓库 默认地址为~/.m2/, 一个构件只有在本地仓库存在之后, 才能由Maven项目使用。因为Android项目不属于Maven项目,所以通常没有本地仓库,但是它会有本地缓存,在~/.gradle/caches/modules-2/files-2.1目录下面。当然也可以给Android项目指定本地仓库,我前面的文章Gradle in action 2.4节讲gradle插件时,里面的插件发布和引用都是到本地仓库。
- 远程仓库 远程仓库分为中央仓库和私库,中央仓库是一些公司或开源组织提供的全球所有用户都能使用的仓库,私库是局域网或者指定组织才能使用的仓库。很多公司都搭有自己的私库,当用户想私库请求一个构件,私库中不存在,它通常会先去中央仓库请求,然后缓存下来再为用户提供下载。
目前最常用的maven中央仓库为Maven Central和jcenter。
Maven Central是由sonatype.org维护的Maven仓库,它是很多机构默认的中央仓库,早期Android项目默认的仓库也是Maven Central。在android项目中指定Maven Central需要在根目录的build.gradle中加入如下代码:
repositories {
mavenCentral()
}
可在后面两个地址浏览所有仓库构件: https://repo1.maven.org/maven2/和https://oss.sonatype.org/content/repositories/releases/ ,也可在http://search.maven.org/ 直接搜索构件。
jcenter是由JFrog公司提供的中央仓库,现在是Android项目默认的仓库,我们新建一个Android项目时在build.gradle中能看到
repositories {
jcenter()
}
在我写文章时这个网站(https://jcenter.bintray.com) 打开可以浏览构件,只有登录后才能搜索构件,跟我之前看到的有些不同。目前Android项目默认仓库是jcenter,目前普遍观点jcenter比maven central好一些,这些观点主要来自于JFrog官网和Android迁移到jcenter时的一个通告博客:
- jcenter通告CDN发布;
- 支持https;
- jcenter是目前最大的仓库,是maven central的超集;
- jcenter有更友好的UI,并且易于用户上传构件。
当然我们也可以使用特定的Maven服务器,类似于:
repositories {
maven { url 'https://maven.fabric.io/public' }
}
还有一些公司的开源库放到自己的仓库维护,例如android的兼容库,在jcenter中是找不到的,但是在google的仓库中是可以找到,地址是https://maven.google.com/,可以gradle中配置google()即可。Facebook的RN库,从2.0以后的版本也没有放到公共仓库中了,通过node构建RN项目时,它会下载到node_module中的本地仓库
3. 如何发布自己的aar库到中央仓库
上面提到了两个中央仓库,我们可以把我们自己的构建发布到这两个仓库。jcenter是超集,所以只需要发布到maven central,构件会自动同步到jcenter上的。同样,我们发布到jcenter上面的库也可以同步到maven central,不过要手动去同步。
后面一篇文章我会介绍如何发布构件到中央仓库