怎么把自己的Android library上传到jCenter和Maven Central

来源:互联网 发布:淘宝达人入口在哪 编辑:程序博客网 时间:2024/04/29 13:46

看了网上好多篇相关文章,研究许久,才终于成功,自己整理并分享给大家

如果你想在Android Studio中引入一个library到你的项目,你只需添加如下的一行代码到模块的build.gradle文件中。

    dependencies {    compile 'com.facebook.fresco:fresco:0.9.0'}

就是如此简单的一行代码,你就可以使用这个library了。

酷呆了。不过你可能很好奇Android Studio是从哪里得到这个library的。这篇文章将详细讲解这是怎么回事,包括如何把你的库发布出去分享给世界各地的其他开发者,这样不仅可以让世界更美好,还可以耍一次酷。

Android studio 是从哪里得到库的?

先从这个简单的问题开始,我相信不是每个人都完全明白Android studio 是从哪里得到这些library的。莫非就是Android studio 从google搜索然后下载了一个合适的给我们?

呵呵,没那么复杂。Android Studio是从build.gradle里面定义的Maven 仓库服务器上下载library的。Apache Maven是Apache开发的一个工具,提供了用于贡献library的文件服务器。总的来说,只有两个标准的Android library文件服务器:jcenter 和  Maven Central。

jcenter

jcenter是一个由 bintray.com维护的Maven仓库 。你可以在这里看到整个仓库的内容。

我们在项目的build.gradle 文件中如下定义仓库,就能使用jcenter了:

  1. allprojects {
  2.     repositories {
  3.         jcenter()
  4.     }
  5. }

Maven Central

Maven Central 则是由sonatype.org维护的Maven仓库。你可以在这里看到整个仓库。

注:不管是jcenter还是Maven Central ,两者都是Maven仓库

我们在项目的build.gradle 文件中如下定义仓库,就能使用Maven Central了:

  1. allprojects {
  2.     repositories {
  3.         mavenCentral()
  4.     }
  5. }

注意,虽然jcenter和Maven Central 都是标准的 android library仓库,但是它们维护在完全不同的服务器上,由不同的人提供内容,两者之间毫无关系。在jcenter上有的可能 Maven Central 上没有,反之亦然。


除了两个标准的服务器之外,如果我们使用的library的作者是把该library放在自己的服务器上,我们还可以自己定义特有的Maven仓库服务器。Twitter的Fabric.io 就是这种情况,它们在https://maven.fabric.io/public上维护了一个自己的Maven仓库。如果你想使用Fabric.io的library,你必须自己如下定义仓库的url。

  1. repositories {
  2.     maven { url 'https://maven.fabric.io/public' }
  3. }

然后在里面使用相同的方法获取一个library。

  1. dependencies {
  2.     compile 'com.crashlytics.sdk.android:crashlytics:2.2.4@aar'
  3. }

但是将library上传到标准的服务器与自建服务器,哪种方法更好呢?当然是前者。如果将我们的library公开,其他开发者除了一行定义依赖名的代码之外不需要定义任何东西。因此这篇文章中,我们将只关注对开发者更友好的jcenter 和 Maven Central 

实际上可以在Android Studio上使用的除了Maven 仓库之外还有另外一种仓库:Ivy 仓库 。但是根据我的经验来看,我还没看到任何人用过它,包括我,因此本文就直接忽略了。

理解jcenter和Maven Central

为何有两个标准的仓库?

事实上两个仓库都具有相同的使命:提供Java或者Android library服务。上传到哪个(或者都上传)取决于开发者。

起初,Android Studio 选择Maven Central作为默认仓库。如果你使用老版本的Android Studio创建一个新项目,mavenCentral()会自动的定义在build.gradle中。

但是Maven Central的最大问题是对开发者不够友好。上传library异常困难。上传上去的开发者都是某种程度的极客。同时还因为诸如安全方面的其他原因,Android Studio团队决定把默认的仓库替换成jcenter。正如你看到的,一旦使用最新版本的Android Studio创建一个项目,jcenter()自动被定义,而不是mavenCentral()。

有许多将Maven Central替换成jcenter的理由,下面是几个主要的原因。

- jcenter通过CDN发送library,开发者可以享受到更快的下载体验。

- jcenter是全世界最大的Java仓库,因此在Maven Central 上有的,在jcenter上也极有可能有。换句话说jcenter是Maven Central的超集。

- 上传library到仓库很简单,不需要像在 Maven Central上做很多复杂的事情。

- 友好的用户界面

- 如果你想把library上传到 Maven Central ,你可以在bintray网站上直接点击一个按钮就能实现。


基于上面的原因以及我自己的经验,可以说替换到jcenter是明智之举。

所以我们这篇文章将把重心放在jcenter,反正如果你能成功把library放在jcenter,转到 Maven Central 是非常容易的事情。

gradle是如何从仓库上获取一个library的?

在讨论如何上传library到jcenter之前,我们先看看gradle是如何从仓库获取library的。比如我们在 build.gradle输入如下代码的时候,这些库是如果奇迹般下载到我们的项目中的。

  1. compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3'

一般来说,我们需要知道library的字符串形式,包含3部分

  1. GROUP_ID:ARTIFACT_ID:VERSION

上面的例子中,GROUP_ID是com.inthecheesefactory.thecheeselibrary ,ARTIFACT_ID是fb-like,VERSION是0.9.3。

GROUP_ID定义了library的group。有可能在同样的上下文中存在多个不同功能的library。如果library具有相同的group,那么它们将共享一个GROUP_ID。通常我们以开发者包名紧跟着library的group名称来命名,比如com.squareup.picasso。然后ARTIFACT_ID中是library的真实名称。至于VERSION,就是版本号而已,虽然可以是任意文字,但是我建议设置为x.y.z的形式,如果喜欢还可以加上beta这样的后缀。

下面是Square library的一个例子。你可以看到每个都可以很容易的分辨出library和开发者的名称。

  1. dependencies {
  2.   compile 'com.squareup:otto:1.3.7'
  3.   compile 'com.squareup.picasso:picasso:2.5.2'
  4.   compile 'com.squareup.okhttp:okhttp:2.4.0'
  5.   compile 'com.squareup.retrofit:retrofit:1.9.0'
  6. }

那么在添加了上面的依赖之后会发生什么呢?简单。Gradle会询问Maven仓库服务器这个library是否存在,如果是,gradle会获得请求library的路径,一般这个路径都是这样的形式:GROUP_ID/ARTIFACT_ID/VERSION_ID。比如可以在http://jcenter.bintray.com/com/squareup/otto/1.3.7 和  https://oss.sonatype.org/content/repositories/releases/com/squareup/otto/1.3.7/

下获得com.squareup:otto:1.3.7的library文件。

然后Android Studio 将下载这些文件到我们的电脑上,与我们的项目一起编译。整个过程就是这么简单,一点都不复杂。

我相信你应该清楚的知道从仓库上下载的library只是存储在仓库服务器上的jar 或者aar文件而已。有点类似于自己去下载这些文件,拷贝然后和项目一起编译。但是使用gradle依赖管理的最大好处是你除了添加几行文字之外啥也不做。library一下子就可以在项目中使用了。

了解aar文件

等等,我刚才说了仓库中存储的有两种类型的library:jar 和 aar。jar文件大家都知道,但是什么是aar文件呢?

aar文件时在jar文件之上开发的。之所以有它是因为有些Android Library需要植入一些安卓特有的文件,比如AndroidManifest.xml,资源文件,Assets或者JNI。这些都不是jar文件的标准。

因此aar文件就时发明出来包含所有这些东西的。总的来说它和jar一样只是普通的zip文件,不过具有不同的文件结构。jar文件以classes.jar的名字被嵌入到aar文件中。其余的文件罗列如下:

- /AndroidManifest.xml (mandatory)
- /classes.jar (mandatory)
- /res/ (mandatory)
- /R.txt (mandatory)
- /assets/ (optional)
- /libs/*.jar (optional)
- /jni/<abi>/*.so (optional)
- /proguard.txt (optional)
- /lint.jar (optional)

可以看到.aar文件是专门为安卓设计的。因此这篇文章将教你如何创建与上传一个aar形式的library。

如何上传library到jcenter

概述

将自己写的库上传到Jcenter或者Maven提供给自己或者别人使用,在构建项目的时候只要写上一行如下类似的引用代码即可引用自己的库。是不是很酷的一件事情,本文一步一步教你如何将自己的代码发布到JCenter上,带你装逼带你飞。

compile 'com.android.support:recyclerview-v7:23.3.0'
  • 1
  • 1

本人使用的软件环境

软件名称版本号操作系统Windows 10Android Studio2.2.2Gradle2.14.1com.android.tools.build:gradle2.2.2com.github.dcendents:android-maven-gradle-plugin1.5.0com.jfrog.bintray.gradle:gradle-bintray-plugin1.7.3

上传到代码到Jcenter

1.到Bintray官网注册账号

注册相关信息

到Bintray官网注册账号,填写相关信息,填写的Organization Id很重要,一定要记起来到时候上传代码的时候要用。另外邮箱也不要填写比如qq.com、163.com的邮箱,会无法注册的。最好是填写GMail邮箱地址。注册完成之后到你填写的邮箱里面去激活Bintray账号即可。

2.创建代码仓库

创建代码仓库

点击上图所示的“Add NewRepository”按钮,添加代码仓库,点击后就会跳转到下图的界面。

完善代码仓库信息

在上图的Name输入框中输入代码仓库的名称,名字可以随便写,但是一定要记得,因为后面上传代码的时候还要用,Type选择Maven即可。点击Create即可创建代码仓库,若创建成功则会跳转到下面的页面。

代码仓库创建完成后的显示界面

如上图红色框框所示代码仓库的路径就是Organization Id/Repository Name,本人创建的代码仓库即为(coolcode/maven),另外要记住的信息是上图右上角的Bintray User(Bintray的用户名),因为后面上传代码要用到。

3.获取账号对应的API KEY

个人信息编辑界面

点击个人头像进入到个人信息主界面,点击Edit按钮即可进入到上图所示的界面。点击“API KEY”,输入Bintray本账号的登陆密码,即可查看到本账号的API KEY。到此为止我们已经获取到了如下四条重要的信息,请牢记:

  • Organization Id(组织ID)
  • Repository Name(仓库名称)
  • Bintray User(Bintray账号的用户名)
  • Bintray API Key(Bintray账号的API KEY)

4.在Project的build.gradle添加如下信息

// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {    repositories {        jcenter()    }    dependencies {        classpath 'com.android.tools.build:gradle:2.2.2'        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' //用于打包Maven所需文件        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' //用于上传Maven生成的文件到Bintray    }}allprojects {    repositories {        jcenter()    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

5.在Module的根目录下创建bintrayUpload.gradle文件

apply plugin: 'com.github.dcendents.android-maven'apply plugin: 'com.jfrog.bintray'//加载属性文件Properties properties = new Properties()File localPropertiesFile = project.file("bintray.properties");if (localPropertiesFile.exists()) {    properties.load(localPropertiesFile.newDataInputStream())}File projectPropertiesFile = project.file("project.properties");if (projectPropertiesFile.exists()) {    properties.load(projectPropertiesFile.newDataInputStream())}//读取属性def projectRepositoryName = properties.getProperty("project.repositoryName")def projectName = properties.getProperty("project.name")def projectGroupId = properties.getProperty("project.groupId")def projectArtifactId = properties.getProperty("project.artifactId")def projectVersionName = android.defaultConfig.versionNamedef projectPackaging = properties.getProperty("project.packaging")def projectSiteUrl = properties.getProperty("project.siteUrl")def projectGitUrl = properties.getProperty("project.gitUrl")def developerId = properties.getProperty("developer.id")def developerName = properties.getProperty("developer.name")def developerEmail = properties.getProperty("developer.email")def bintrayUser = properties.getProperty("bintray.user")def bintrayApikey = properties.getProperty("bintray.apiKey")def bintrayOrganizationId = properties.getProperty("bintray.organizationId");def javadocName = properties.getProperty("javadoc.name")/**这句代码一定要加否则会出现如下错误* Could not upload to 'https://api.bintray.com/content/coolcode/maven/LibUiBase/1.0.0/CommonLibrary/LibUiBase/1.0.0/LibUiBase-1.0.0.pom': HTTP/1.1 400 Bad Request [message:Unable to upload files: Maven group, artifact or version defined in the pom file do not match the file path 'CommonLibrary/LibUiBase/1.0.0/LibUiBase-1.0.0.pom']* */group = projectGroupId// 配置生成POM.xml文件的参数install {    repositories.mavenInstaller {        pom {            project {                name projectName                groupId projectGroupId                artifactId projectArtifactId                version projectVersionName                packaging projectPackaging                url projectSiteUrl                licenses {                    license {                        name 'The Apache Software License, Version 2.0'                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'                    }                }                developers {                    developer {                        id developerId                        name developerName                        email developerEmail                    }                }                scm {                    connection projectGitUrl                    developerConnection projectGitUrl                    url projectSiteUrl                }            }        }    }}//生成sources.jartask sourcesJar(type: Jar) {    from android.sourceSets.main.java.srcDirs    classifier = 'sources'}task javadoc(type: Javadoc) {    source = android.sourceSets.main.java.srcDirs    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))}//生成javadoc.jartask javadocJar(type: Jar, dependsOn: javadoc) {    classifier = 'javadoc'    from javadoc.destinationDir}artifacts {    archives javadocJar    archives sourcesJar}//javadoc的配置javadoc {    options {        encoding "UTF-8"        charSet 'UTF-8'        author true        version projectVersionName        links "http://docs.oracle.com/javase/7/docs/api"        title javadocName    }}/**userOrg为bintray账号信息里面的Organization Id*repo为你创建的仓库名称* 如果上述两个字段写错了,则会出现下面类似的错误*Could not create package 'huangxuanheng/maven/fragmentstack': HTTP/1.1 404 Not Found [message:Repo 'maven' was not found]*** */bintray {    user = bintrayUser    key = bintrayApikey    configurations = ['archives']    pkg {        userOrg = bintrayOrganizationId        repo = projectRepositoryName        name = projectName        websiteUrl = projectSiteUrl        vcsUrl = projectGitUrl        licenses = ["Apache-2.0"]        publish = true    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132

6.在Module的build.gradle中应用上面创建的bintrayUpload.gradle文件,添加如下代码

apply from: "bintrayUpload.gradle"
  • 1
  • 1

7.在Module的根目录下创建第5步要读取的配置文件

创建bintray.properties用于配置bintray和开发者信息

#配置bintray账号相关信息#bintray用户名,不是登陆邮箱,是个人中心右上角显示的名字bintray.user=xxx#bintray的ApiKeybintray.apiKey=xxxxxxxxxxx#bintray的Organization Idbintray.organizationId=xxx#配置开发者信息#昵称 需修改developer.id=xxx#姓名developer.name=xxx#邮箱developer.email=xxx@gmail.com
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

创建project.properties用于配置项目信息

#project#仓库名称,就是在bintray官网建立的仓库的名称project.repositoryName=maven#项目名称project.name=library#项目组idproject.groupId=com.lyf.library#项目id,一般同project.nameproject.artifactId=library#打包类型project.packaging=aar#项目官方网站地址 需修改project.siteUrl=https://github.com/xxx/library#项目git地址 需修改project.gitUrl=https://github.com/xxx/library.git#生成的javadoc名称javadoc.name=library
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

8.在Terminal窗口下收入如下指令上传到Bintray

gradlew installgradlew bintrayUpload
  • 1
  • 2
  • 1
  • 2

若出现BUILD SUCCESSFUL则说明成功上传到了Bintray。 注:以上所有xxx都需要替换成自己配置

9.添加Package到JCenter

进入到Bintray网站,找到刚才上传的项目,点击右下角的“Add To JCenter”按钮。

点击右下角的“Add To JCenter”按钮

然后填写项目描述点击“Send”提交审核即可,如果审核成功,它会给你发送一封站内信通知你。

10.引用成功

//引用方式如下compile '项目组ID:项目名称:项目版本号'//引用示例compile 'com.android.support:recyclerview-v7:23.3.0'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

常见问题及解决方案

1.

Could not upload to 'https://api.bintray.com/content/coolcode/maven/LibUiBase/1.0.0/CommonLibrary/LibUiBase/1.0.0/LibUiBase-1.0.0.pom': HTTP/1.1 400 Bad Request [message:Unable to upload files: Maven group, artifact or version defined in the pom file do not match the file path 'CommonLibrary/LibUiBase/1.0.0/LibUiBase-1.0.0.pom']
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

解决方案:

出现这个问题的原因有可能是project.properties里面的project.name的属性值与project.artifactId不一致,或者是bintrayUpload.gradle里面的group = projectGroupId脚本没有写,尝试修改上面两种可能出现该问题的脚本。

2.

Could not create package 'coolcode/maven/LibUIBase': HTTP/1.1 404 Not Found [message:Repo 'maven' was not found]
  • 1
  • 1

解决方案:

出现这个问题的原因可能是名为maven的仓库(不一定是叫maven,名字只要和bintray网站建立仓库时的名称一致即可)没有建立,或者建立了仓库,但是名称不叫maven,又或者组织名称不叫coolcode,因为项目上传的路径为:组织ID/仓库名称/项目名,所以检查组织ID和仓库名称是否正确即可解决问题。

0 0
原创粉丝点击