构建仓库与管理器
[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上。
一张图片看懂:
参考文档: