拥抱 Android Studio 之四:Maven 库房运用与私有库房建立-Android-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝27
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:184回复:0

  拥抱 Android Studio 之四:Maven 库房运用与私有库房建立

楼主#
更多 发布于:2016-05-20 19:02


这篇文章为“拥抱Android
Studio”系列第四篇。作者何畅彬,现任BugTags技术总监,重视移动SDK研制、后端效劳设计与完结。
运用 Android Studio,必然要与 maven 库房频频打交道,在发明和共享自个发明的
Android library 的时分,maven 库房的常识更是必不可少。本章将为开发者体系梳理这方面的常识。
运用、发明和共享
笔者从前不思量力的思考过『是什么推动了互联网技术的迅速开展?』这种无穷的出题。结论是,除了摩尔定律以外,技术经历的迅速堆集和广泛共享,也是首要的因素。
有人戏称,『写
Java,首先要学会选包』,在这儿欠好谈论对错。不过这句话里边,最少包括两层意思:首先 Java 有很多的现成的依靠包,不必要自个造轮子;其次,Java
的包寄存较为会集,集成方法也便利。
笔者从事 Android 和 Java 开发以来,经历了几个期间:
闭门造轮子 > 运用他人的轮子 > 开门造轮子 > 共享轮子
在运用、发明、共享轮子的进程中,maven 库房的运用可谓必备技术。
信任各位运用 Android
Studio,关于jcenter()、mavenCentral()等概念应该是习以为常了。程序员要知其然,知其所以然。本篇将依照如下脉络介绍在 Android
Studio 中 Maven 库房有关的概念和运用。
Maven 包
Maven 库房
发布包到本地库房
发布包到 Bintray Jcenter 长途库房
发布包到 Sonatype MavenCentral 长途库房
建立私有 Sonatype 库房
建立私有 Artifacotory 库房
Maven 包(Package)
至于 Maven 是什么,请参阅 Apache Maven。
关于 Android 开发者而言,只需求知道 Maven 是一种构建东西,Maven 包是由所谓
POM(Project Object Model)所界说的文件包格局即可。
Gradle 能够运用 Maven 包,而且大多数的 Android 能够运用的长途依靠包都是
Maven 包。
先来看一个保管在某库房上的 Maven 包:Bugtags-Android-Lib
所包括的内容:
bugtags-lib-1.1.0-javadoc.jar//javadoc
文件bugtags-lib-1.1.0-javadoc.jar.asc//javadoc
文件的签名bugtags-lib-1.1.0-sources.jar//源码文件bugtags-lib-1.1.0-sources.jar.asc//源码文件的签名bugtags-lib-1.1.0.aar//Android
Library
的主文件包bugtags-lib-1.1.0.aar.asc//主文件包的签名bugtags-lib-1.1.0.pom//包描绘文件bugtags-lib-1.1.0.pom.asc//描绘文件的签名
关于一个合符标准的 Maven Package,pom 文件、aar(或许 jar)
文件是有必要的。
而 javadoc 文件、源码文件、签名文件都不是必要的,可是某些揭露库房(如
mavenCentral )有此要求。
运用这个包的方法,信任咱们现已很熟悉了:
dependencies {    compile
'com.bugtags.library:bugtags-lib:1.1.0'}
POM 文件
一个 Maven Package,最首要即是 POM(Project Object Model)
文件,这本来是一个 XML 文件,这儿截取 Bugtags-Android-Lib POM 首要内容如下:
4.0.0com.bugtags.librarybugtags-lib1.1.0aarcom.android.supportsupport-v419.0.0compile
modelVersion: 从 mvn 2.x 起,这个数值都是4.0.0
packaging:打包方法,aar 是 Android Libirary 的打包方法,常用的还有
jar
dependency:声明依靠列表
包的仅有标示:
com.bugtags.librarybugtags-lib1.1.0
其间三个字段与 Gradle
的依靠格局'com.bugtags.library:bugtags-lib:1.1.0'冒号切割的三段一一对应。这就解说了所谓的Gradle 兼容 Maven
包。
Maven 库房
Maven 包会集寄存的当地,即是 Maven
库房。这些库房,可所以放在本地,也能够放在某个长途效劳器上。 可所以私有库房,也可所以揭露的。下面是笔者平时开发用的库列表:
mavenCentral();jcenter()maven {     url
'file:///Users/my-user-name/Documents/Android/repo/'}maven {     url
'http://192.168.99.100:8081/content/repositories/releases/'}
Android Studio Gradle 首要支撑两个 Maven
中心库:mavenCentral和jcenter。
mavenCentral 是最早的 maven 中心库房
jcenter 是 Android Studio 0.8 版别起的默许 maven 中心库房
第三个是笔者的本机的库房
第四个是笔者布置在内网效劳器的私有库房
读者可能会发现两个疑问:
为何有了 mavenCentral,google还切换到了 jcenter?
maven { url : xxx},这种格局能够装备任何一个存在的库房?
解说如下:
jcenter VS. mavenCentral
依据这篇博客,jcenter 具有如下优胜特点,使得google进行切换:
jcenter 是一个 mavenCentral 的超集,jcenter 还包括了别的 maven

jcenter 具有非常好的 cdn,默许支撑 https,这个关于google有无穷吸引力
bintray(jcenter 的效劳供给商)标明 jcenter 具有非常好的功用
稀有据标明 bintray jcenter 占用更少的本地缓存空间
非常好的交互界面,能够从 jcenter 向 mavenCentral
同步包(下面两个渠道的运用教程将会证明这一点)
笔者亲测,在 bintray 上发布包到 jcenter 在易用性上确实比 在 sonatype
发布到到 mavenCentral 要好得多。
运用契合标准的 maven 库房
没错,你能够经过maven { url : xxx }运用任何一个契合 maven
标准的库房。
存在本地的
maven { url
'file:///Users/my-user-name/Documents/Android/repo/'}
存在内网效劳器的
maven { url
'http://192.168.99.100:8081/content/repositories/releases/'}
存在某个长途效劳器的
maven {    url
'https://raw.githubusercontent.com/liaohuqiu/umeng-libs/master/repository'}
此库房由 liaohuqiu 同学为便利咱们运用友盟开发者东西,把相应的包做成了契合标准的
Maven 包,保管在 github 项目中。
发布 Maven 包
运用 maven 包信任现已很明白了,让咱们更进一步。
当咱们在平时开发实践中,堆集了一些公共库,想要固定下来,被自个或许他人便利的运用,就需求发布
maven 包。
一个契合标准的 maven 包最少包括 pom
文件和主文件包。莫非这些都要手动编写和创立么?
答案是:有了 gradle 插件,你只需求干很少的事儿。
大局设定
下面以发布这系列包为示例:
groupId: com.as-gradle.demo //改成你的 groupId
artifcatId: x //artifactId
会有些改变,这儿先用x替代,下面会修正。
version: 1.0.0
也即是'com.as-gradle.demo:x:1.0.0'
读者要进行练习的时分,最佳改一下你的groupId,不然可能会发布失利
下面运用到的示例工程现已放在了 github 上。
为了后边运用便利,首先在工程的项目gradle.properties中界说一些特点,这些特点,首要是用生成
POM 文件,将会在通篇文章中用到:
#
包信息PROJ_GROUP=com.as-gradle.demoPROJ_VERSION=1.0.0#
项目的描绘PROJ_WEBSITEURL=https://bugtags.comPROJ_ISSUETRACKERURL=https://github.com/bugtags/Bugtags-Android/issuesPROJ_VCSURL=https://github.com/bugtags/Bugtags-Android.gitPROJ_DESCRIPTION=Simple
and effective bug & crash reporting tool for Android apps#
Licence信息PROJ_LICENCE_NAME=The Apache Software License, Version
2.0PROJ_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txtPROJ_LICENCE_DEST=repo#
Developer
信息DEVELOPER_ID=your-dev-idDEVELOPER_NAME=your-dev-nameDEVELOPER_EMAIL=your-email@your-mailbox.com
发布包到本地库房
创立一个 module:localrepo
将本地某个途径设置为库房根目录:
/Users/your-user-name/Documents/Android/repo/( Mac
下)这儿运用了一个叫做your-user-name的用户下的某个目录,请读者自行替换成自个的登录用户名。
为了高雅,在 localrepo 这个 module
的gradle.properties界说特点:
PROJ_NAME=localrepoPROJ_ARTIFACTID=localrepoPROJ_POM_NAME=Local
RepositoryLOCAL_REPO_URL=file:///Users/your-user-name/Documents/Android/repo/
在 module 中运用和装备 maven plugin:
apply plugin: 'maven'uploadArchives {  
 repositories.mavenDeployer {        repository(url: LOCAL_REPO_URL)      
 pom.groupId = PROJ_GROUP        pom.artifactId = PROJ_ARTIFACTID      
 pom.version = PROJ_VERSION      }}
在控制台运转:
$ ./gradlew -p localrepo clean build
uploadArchives --info
一切顺利的话,你的第一个本地包现已发布到设定的目录的本地库房了:
|   ├── com│   ├── as-gradle│   │   └── demo│   │
      └── localrepo│   │           ├── 1.0.0│   │           │   ├──
localrepo-1.0.0.aar│   │           │   ├── localrepo-1.0.0.aar.md5│   │        
  │   ├── localrepo-1.0.0.aar.sha1│   │           │   ├── localrepo-1.0.0.pom│  
│           │   ├── localrepo-1.0.0.pom.md5│   │           │   └──
localrepo-1.0.0.pom.sha1│   │           ├── maven-metadata.xml│   │          
├── maven-metadata.xml.md5│   │           └── maven-metadata.xml.sha1
运用本地包(两个疑问向读者讨教)
要运用这个包,首先在项目的 build.gradle 中增加这个本地库房:
allprojects {repositories {    jcenter()    maven{
       url 'file:///Users/your-user-name/Documents/Android/repo/'    }}}
在某个 module(如 demo 项目中的 app) 的 build.gradle
中增加依靠:
compile
'com.as-gradle.demo:localrepo:1.0.0@aar'
这儿有两个古怪的当地,笔者也没有深入研究,开端猜想是 Android Studio 的
Bug,知道答案的读者请到我博客文章下留言赐教:
依靠结尾通常都需求加一个@aar,在某些版别的 Android
Studio,又不需求,这是为何?
别的,假如本地包自身运用了了长途的依靠,也需求在运用本地包的时分,一起加上,不然会报短少包,这又是为何?
想要让更多的人运用到你的劳动成果,你就需求把 Maven
包放在一个他人有权拜访的长途库房上,而不是本机,接下来要介绍发布 Maven 到 jcenter 库房和 mavenCentral
库房。由于前者的运用简略,本着『先易后难,迅速出成效』的准则,我先介绍 jcenter 的上载。
发布包到 Bintray jcenter 长途库房
简介
jcenter 是由 bintray 供给的 maven 中心库保管效劳,bintray 又是
jfrog 公司的一款商品。jfrog
是一个商业公司,经过供给高级效劳盈余,又为一般开发者供给了足够用的免费基础功用(截止至2016-01-24),笔者较为推崇这种开发者效劳的商业模式。
引证一张图来表述 bintray 的工作方法

图像来历,http://inthecheesefactory.com/
运用 jcenter 需求在 bintray
上注册账号,在本地进行加密签名装备,下面开端介绍。
1. 注册账号
登入 jcenter 主页
sigin -> signup,填写表单,留意 username 这一栏是后边的
bintray 私有库的后缀,要稳重挑选。
2. 创立 GPG 签名
前方高能预警:对比繁琐,切勿半途抛弃
前面介绍过,能够把 bintray 的包同步到
mavenCentral,而后者需求对包文件进行签名,签名和验证进程需求用到一个叫做GPG 的东西发生的公钥和私钥。这儿有适合多个渠道的 GPG
程序,下面只介绍 OSX 渠道。
这种东西大约的含义是发生公钥和私钥,把公钥发送到揭露的效劳器,私钥用来发生包文件签名。包的运用者在拿到包文件以后,经过公钥来验证文件的有效性,运转详细原理参阅这儿。
下载 gpgtool,装置
检测装置成功,在指令行运转
$ gpg --versiongpg (GnuPG/MacGPG2) 2.0.28libgcrypt
1.6.3
有类似的输出,即是正常装置了
发生证书,运转指令,依照提示输入
$ gpg --gen-key
查看成果
$ gpg --list-keys
找到方才创立证书的时分,输入的有关信息那三行,例如:
pub   2048R/2E686B39 2015-06-02uid      
[ultimate] Your Namesub   2048R/your-sub-key-id
2015-06-02
上载公钥到效劳器,找到你的 pub
的那一行,2048R/后的那一串八位字符串,如上面的:2E686B39,即是公钥 ID
$ gpg --keyserver hkp://pool.sks-keyservers.net
--send-keys your-public-key-id
输出公钥和私钥成文件
$ gpg -a --export your-email@your-mailbox.com >
public_key_sender.asc$ gpg -a --export-secret-key your-email@your-mailbox.com
> private_key_sender.asc
装备本地 gradle
运转环境的特点,坐落~/.gradle/gradle.properties,增加内容:
signing.keyId=your-public-key-idsigning.password=your-gpg-passwordsigning.secretKeyRingFile=/Users/your-user-name/.gnupg/secring.gpg
bintray 自身能够经过在 profile->GPG Sining 中装备 public
key 和 private key
来主动对上载的文件进行签名,鄙人图中,对应填入public_key_sender.asc与private_key_sender.asc的内容即可。

设置 bintray maven 包主动签名
挑选 maven 库房主页,进入 edit:

最下面有两个选项:
GPG sign uploaded files using Bintray's
public/private key pair.GPG Sign uploaded files automatically
由于咱们是期望运用自个的 key,所以勾选第二个。
3. 创立 bintray 项目
主页-> maven -> add new package,填入对应的信息,其间
name 是鄙人面 bintray gradle 插件上载的时分,运用的项目称号,例如:bintryaar,这是要上载一个 Android
Library,上载纯 Java 包的方法有点点不相同,下面有介绍。

4. 装备插件
bintray 官方在 github 上保管了 bintray-examples,便利用户运用
gradle 上载包。由于这儿要上载的是 aar 格局的包,所以,详细是参阅 gradle-aar-example
比如,然而比如有一些当地没有更新,请留意下面的描绘。
在 项目 中创立 local.properties 来装备 bintray 登入信息以及 gpg
证书暗码其间 your-bintray-user 即是 bintray 右上角显现的用户称号,your-bintray-apikey 在
profile->API Key 能够找到,your-gpg-password 则是创立 gpg 证书的时分的暗码
bintray.user=your-bintray-userbintray.apikey=your-bintray-apikeybintray.gpg.password=your-gpg-password
在项目的 build.gradle 装备 buildscript 的 classpath
buildscript {repositories {  
 jcenter()}dependencies {    classpath 'com.android.tools.build:gradle:1.3.0'  
 //下面两个包是用于上载的插件    classpath
'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'    classpath
'com.github.dcendents:android-maven-gradle-plugin:1.3'//留意此处}}
在 module 的 gradle.properties 文件中界说特点
PROJ_NAME=bintrayaarPROJ_ARTIFACTID=bintrayaarPROJ_POM_NAME=Bintray
Aar Repository
在 module 的 build.gradle 中运用插件
apply plugin:
'com.github.dcendents.android-maven'apply plugin: 'com.jfrog.bintray'
为了build.gradle 文件洁净,笔者创立了一个名为 bintray.gradle
的文件装备插件信息,请参阅这个文件。
要害点:
artifacts {archives javadocJararchives
sourcesJar}
是为了一起生成 javadoc.jar 和 sources.jar 文件
build,上载
$ ./gradlew -p bintrayrepo/ clean build
bintrayUpload --info
假如一切顺利,你会在控制台看到多个文件上载成功的标输出
踩坑实录
HTTP/1.1 401 Unauthorizedapikey 或许 user 填写过错
HTTP/1.1 409 Conflict包的该版别现已存在,需求在 bintray
办理界面上删除该版别后才能够再次上载
想让 sources.jar 或许 javadoc.jar 为空
task sourcesJar(type: Jar) {    classifier =
'sources'    from sourceSets.main.java.srcDirs    exclude '**'}
5. 上载 Jar 包
在上载 jar 的时分,运用的插件有些差异
apply plugin: 'maven-publish'apply plugin:
'com.jfrog.bintray'
在生成契合规定的 pom 文件的时分,要调用 groovy 的API,详细请参阅这个文件
6. 经过私有库房的方法引证
至此,方才上载的两个库,现已能够经过如下方法引证了
allprojects {    repositories {            maven {
               url 'https://dl.bintray.com/freefaces/maven'//这个地址在包的页面的右方      
     }    }}compile 'com.as-gradle.demo:bintrayaar:1.0.0'compile
'com.as-gradle.demo:bintrayjar:1.0.0'
可是你也发现了,包的用户需求增加一个额定的 maven
库房。作为一个以用户价值为先的库的开发者,那当然不期望用户费事的。那就需求把这个私有的库,推送到 jcenter 上去。
7. 推送到 jcenter
在 bintray 的 maven 库的界面,有add to jcenter

点击以后,会进入一个音讯页面,写或许不写都能够。提交,等待回复即可。
记住,包有必要满足如下条件:
包括 sources.jar 和 javadoc.jar 文件
有必要是 maven 包
bintray 的音讯体系有些
bug,假设你的包提交请求被驳回,你修正以后再提交请求,可能没有人回复你。请不要傻等。直接找页面右侧的 Feedback,这个他们是很快有人答复的。
成功了以后,会呈现如下的符号:

你能够在 jcenter 效劳器上看到你的包了
8. 推送到 mavenCentral
在包办理页面,能够找到推送到 mavenCentral 功用,

一个包要从 bintray 推送到 jcenter,有几个条件:
现已推送到了 jcenter [已完结]
每个文件都有对应的签名[已完结]
有 sonatye 账户[未完结]
maven 库房经过审阅[未完结]
点击 Sync 以后,一段时间以后,右边的 Sync Status 会反应出成果。
当然了,如今咱还干不了这个,由于还有两个条件没预备好。那咱们就进入 mavenCentral
的条件预备。
发布包到 Sonatype MavenCentral 长途库房
1. 注册 sonatye 账户
进入 sonatype issue 页面,注册账号。
2. 创立 issue
登入以后,顶部有按钮,Created,下面是要害的条目
Project:Community Support - Open Source Project
Repository Hosting (OSSRH)
Issue Type: New Project
Group Id:即是你的包的 groupId
别的的都仔细填写。承认以后,大约两个工作日, Issue 会成为 resolved
状态,就能够发布你的包了。有了这两部,本来就能够从 bintray 上直接反向推到 mavenCentral
,而不需求走下面的过程了,可是我仍是简略介绍一下下面的过程。假如很感爱好详情,能够参阅 trinea 的介绍。
3. 上载包
也有便利的 gradle 插件协助咱们进行传送,能够参阅
chrisbanes/gradle-mvn-push 项目。装备好插件,上载。
4. 发布包
登入 oss sonatype,登入,挑选左面栏里的Staging Repositories,
然后点Close 按钮,sonatype 会做呼应的 validation,经过的话,就能够点 Release 发布啦,假如不经过,就查看疑问,先
Drop,并重新做 Staging 发布。
5. 查看包

https://oss.sonatype.org/content/repositories/releases 能够看到你发布的包。
6. 为何如此简略
由于这个进程真的很繁琐,ui 也不友爱,在体验了 bintray 的快捷和友爱,并发现
bintray 能够反向推送到 mavenCentral 以后,我就再也不想运用 sonatype 了。无法,贪嗔痴是人类天分。
建立sf
由于“你懂得”的因素,在国内拜访 jcenter,老是偶然不安稳,常常会呈现比如 peer not
found 这种过错。为了确保用户的安稳运用库,那就要思考建立放在自个效劳器上的私有库房。
Sonatype 和 bintray 都供给了可供自个布置的 maven
库办理软件。Sonatype 供给了免费的 sonatype/nexus,bintray 供给了免费的 artifactory-oss。
为了布置简洁,笔者运用了 docker 进行这两个sf建立。关于 docker
是什么,怎么用,并不是系列文章的要点。有爱好能够自行学习。入门文档在此。
建立私有 Sonatype 库房
下载装置 docker 镜像
$ docker pull sonatype/nexus
运转镜像
$ docker run -d -p 8081:8081 --name nexus
sonatype/nexus:oss
拜访效劳器由于的 docker-machine ip
是:192.168.99.100,于是能够经过在浏览器拜访http://192.168.99.100:8081/这个 URL 来拜访 sonatype
sf。
你会发现这个界面跟你在https://oss.sonatype.org/看到的简直相同。
默许账户暗码是:
adminadmin123
设置库房点击左侧 repository,会呈现 repository
的列表,把其间的Releases的Configutation->Access Setting-> Deploy Polocy设置成Allow
Redeploy使得能够重复发布包。
装备和运用插件我仍是运用了 chrisbanes/gradle-mvn-push
插件,略微改动了一下字段的值,首要改动是环境装备,如账号暗码,repository URL 等,详细请参阅这儿 mvn-push。
要害设置要在gradle.properties中设置:
PROJ_NAME=sonatyaarPROJ_ARTIFACTID=sonatyaarPROJ_POM_NAME=Sonatye
Aar
RepositoryPOM_PACKAGING=aarRELEASE_REPOSITORY_URL=http://192.168.99.100:8081/content/repositories/releasesSNAPSHOT_REPOSITORY_URL=http://192.168.99.100:8081/content/repositories/snapshots
查看上载成功以后,就能够在浏览器的http://192.168.99.100:8081/content/repositories/releases看到这个包。并可引证了。
过错上载的时分,返回400,可能是Configutation->Access
Setting-> Deploy Polocy没设置好;返回401,可能是账号暗码过错。
建立私有 Artifactory 库房
bintray 本来供给了多个私有布置库房的版别,分别是:
Artifactory OSSArtifactory ProArtifactory Pro
Registry
按姓名来看,后两者可能是收费的,这儿就只介绍Artifactory OSS,依然是运用 docker
进行布置运转。更详细的运用手册,参阅 Running with Docker。
下载镜像(截止至2016-01-27,最新版别是4.4.1)
$ docker pull
jfrog-docker-reg2.bintray.io/jfrog/artifactory-oss:4.4.1
运转镜像
$ docker run -d -p 8080:8081
jfrog-docker-reg2.bintray.io/jfrog/artifactory-oss:4.4.1
在浏览器中拜访http://192.168.99.100:8080/,默许账号暗码是:
adminpassword
笔者写到这,发现这个篇幅现已太长了。如今的读者,本来也没有太多耐心看长篇大论,所以思考将更详细的sf的布置,放在一篇独立的博客中解说。
kevinho/gradle-maven-complete
为了便利读者运用 gradle 将 aar、jar包推送到 jcenter 和
mavenCentral,笔者决定将这篇文章所运用的 sample 项目,别离出一个独立的 github
项目:kevinho/gradle-maven-complete,里边包括如下典范:
localrepo:本地库房推送
bintrayaar:bintray 的 aar 包推送
bintrayjar:bintray 的 jar 包推送
sonatypearr:mavenCentral 的 aar 包推送
基本上掩盖到了主流的场景了,期望我这个小轮子,也能协助咱们,喜爱记住 star 哦!
总结
这一篇,笔者联系实例解说了 maven 库房有关的常识,以及将 maven 包经过 gradle
插件上载本地库房、bintray jcenter、sonatype mavenCentral,还扼要介绍了 sonatype 和 artifactory sf的
docker 建立。或许你现已跃跃欲试了,那就赶忙打开你的电脑,把你的轮子,用 maven 装备起来吧!下一篇会介绍 gradle
插件的编写以及发布运用,敬请期待!
参阅文献
inthecheesefactory.com
trinea.cn
wikipedia
apache-maven
sonatype-central
bintray-manual








优质IT资源分享社区为你提供此文。
本站有大量优质android教程视频,资料等资源,包含android基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

android教程视频
优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客