中央仓库

[TOC]

构建仓库与管理器

什么是中央仓库

在中央仓库出现以前,一个工程往往需要引用一些库,那这些库就放在工程的一个lib文件夹下面。每次新建一个工程,你都要拷贝这些库到lib文件夹下面,这就造成了一个问题。一个工程的库文件可能需要更新,这就要靠手动的更新;不同工程引用相同的库文件,都要拷贝一份。

尤其当这个工程需要使用GIt或SVN进行版本管理的时候,这些lib就成了一个噩梦。

当maven仓库出现以后呢?

这个中央仓库就是存放这些库的地方,当你需要引用这些库文件的时候,只是需要在工程中写一条语句就可以了。

举个栗子,在Android中,如果想引用一个包需要怎么写呢:

    compile 'com.android.support:design:23.2.0'

就这么简单。

gradle会自行将在中央仓库中查找该库的相应版本下载到本地,并添加到项目依赖中,编译时会将该库文件一并编译进去。

用这样的方式来管理依赖,可以非常的安装卸载依赖,并且升级也很简单;同时,由于使用脚本语言,避免了git直接保存jar/aar的快照,而是追踪了脚本的变化,对于版本管理也非常方便。

综上所述:Maven仓库就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源。此外,由于Maven仓库中所有的JAR都有其自己的坐标,该坐标告诉Maven它的组ID,构件ID,版本,打包方式等等,因此Maven项目可以方便的进行依赖版本管理。你也不在需要提交JAR文件到SCM仓库中,你可以建立一个组织层次的Maven仓库,供所有成员使用。

Maven仓库能帮助我们管理构件(主要是JAR)。

远程仓库与本地仓库

运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

比如说,你的项目配置了junit-3.8的依赖,在你运行mvn test 的时候,Maven需要使用junit-3.8的jar文件,它首先根据坐标查找本地仓库,如果找到,就直接使用。如果没有,Maven会检查可用的远程仓库配置,然后一次尝试从这些远程仓库下载junit-3.8的依赖,如果找到了就下载下来使用,如果没有则会报错。

在Android中,gradle会将文件下载到.gralde/cache/moduleXX这个文件夹下面,在gradle引用项目时,先从这里找,如果没有,则在指定的maven远程仓库中获取。

指定远程仓库

如果想在Android中指定可以使用

allprojects{
  repositories{
    mavenLocal() //本地仓库
    jcenter() //jcenter
    maven{
      url 'your_remote_repository_url' //指定一个远程仓库
    }
  }
}

//注意 allprojects声明的是该工程以及工程的子工程。

//而在buildScript中声明的repositories仅仅是对于build.gradle脚本本身的声明.(脚本也是调用gradle的API,因此会以来一些文件).

上传aar包到指定的仓库

apply plugin: 'maven'//应用maven插件,这个插件会自动帮你做一些事情
description "unionid"//项目的包名称
group = project.[your defined group] //group id 类似于com.xxx.xxx;
//version = '0.1.6-SNAPSHOT'
version = project.[your defined version]
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "your_url") {
                authentication(userName:'your_usr_name', password:'your_password')
            }
        }
    }
}

一些项目的属性都在gradle.properties中定义

VERSION_NAME=
VERSION_CODE=
GROUP=

题外话

Gradle支持从maven中央仓库和JCenter上获取构件,那这两者有什么区别呢?

maven中央仓库(http://repo1.maven.org/maven2/)是由Sonatype公司提供的服务,它是Apache Maven、SBT和其他构建系统的默认仓库,并能很容易被Apache Ant/Ivy、Gradle和其他工具所使用。开源组织例如Apache软件基金会、Eclipse基金会、JBoss和很多个人开源项目都将构件发布到中央仓库。 maven中央仓库已经将内容浏览功能禁掉了,可在http://search.maven.org/查询构件。

https://jcenter.bintray.com )是由JFrog公司提供的Bintray中的Java仓库。它是当前世界上最大的Java和Android开源软件构件仓库。 所有内容都通过内容分发网络(CDN)使用加密https连接获取。JCenter是Goovy Grape内的默认仓库,Gradle内建支持(jcenter()仓库),非常易于在(可能除了Maven之外的)其他构建工具内进行配置。

JCenter相比mavenCenter构件更多,性能也更好。但还是有些构件仅存在mavenCenter中。

常见工具说明

使用Maven,可以从Maven中央仓库下载所需要的构件(artifact),但这通常不是一个好的做法,一般是在企业内部架设一个Maven仓库服务器,在代理远程仓库的同时维护本地仓库,以节省带宽和时间。企业仓库管理器一般可以提供高并发访问、浏览和查询、报表、访问控制、备份、对其他仓库进行代理、REST API等特性

了解一下构件仓库管理器,市场上最好的是JFrog的Artifactory和Sonatype的Nexus,而且这两个产品既有商业版也有免费社区版。

以Artifactory为例,Ant+Ivy、Maven和Gradle这些构建工具都可以自动下载Artifactory里的构件(artifact),此外Jenkins、Bamboo等CI工具也可以通过构建工具将生成的构件(artifact)部署到Artifactory上。

一张图片看懂:

maven

参考文档:

了解构建仓库管理器Artifactory和Nexus

聊一聊MavenCenter和JCenter

Comments

⬆︎TOP