如何发布一个Android库

经常在github上看到通过类似的语句引进别人的库:

repositories { 
    jcenter()
}
dependencies {
    compile 'com.flipboard:bottomsheet-core:1.5.0' 
    compile 'com.flipboard:bottomsheet-commons:1.5.0' // optional
}

不得不说,使用起来真方便。那如果自己有好的库,如何分享给其他人,或者放在Bintray,方便自己使用呢?

发布第一个Android库(想想还是有点小激动)

先到https://bintray.com注册,注册之后获取API-Key:

api-key.png

必须要特别感谢这位作者:Ashraff Hathibelagal

http://code.tutsplus.com/zh-hans/tutorials/creating-and-publishing-an-android-library--cms-24582
基本上都是按照他的教程做的。
也参考了XRecyclerView的gradle,也表示感谢.

文章虽好,但也有坑....
于是自己又整理了一下

主要分两步:

1,像往常一样写一个library

2,发布到Bintray

这里需要修改两个gradle。

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.0.0'

        /*
        第 1 步:添加必要的插件
        为了在 Android Studio 里与 Bintray 交互,你应该把 Bintray 插件引入到项目的 build.gradle 文件的 dependencies 里。
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
        因为你要把库上传到 Maven 仓库,你还应该像下面这样添加 Maven 插件。
        classpath "com.github.dcendents:android-maven-gradle-plugin:1.3"
         */
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
        classpath "com.github.dcendents:android-maven-gradle-plugin:1.3"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Module build.gradle

apply plugin: 'com.android.library'
/*
第 2 步:应用插件
打开您的库模块的 build.gradle 文件并添加以下代码,以应用我们在上一步中添加的插件。
 */
apply plugin: 'com.jfrog.bintray'
apply plugin: 'com.github.dcendents.android-maven'
/*
第 3 步: 指定 POM 详细信息
在上传库时,Bintray 插件会寻找 POM 文件。 即使 Maven 插件为你生成了它,你也应该自己指定
 groupId 标签和 version 标签的值。 要这样做,请使用 gradle文件中的group 和version 的变量。
 */
version = "1.0.0"
group = "com.example"


def siteUrl = 'https://github.com/heinika/MyHelloWorldLibrary'
def gitUrl = 'https://github.com/heinika/MyHelloWorldLibrary.git'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
}

/*第 4 步: 生成源 JAR
为了遵守 Maven 标准,你的库也应该有一个包含了库的源文件的 JAR 文件。
 为了生成 JAR 文件,需要创建一个新的 Jar任务,
 generateSourcesJar,并且使用 from 功能指定的源文件的位置。*/
task generateSourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier 'sources'
}

/*
第 5 步: 生成 Javadoc JAR
我们同样推荐,在你的库里有一个包含 Javadocs 的 JAR 文件。
 因为目前你还没有任何 Javadocs,需要创建一个新的 Javadoc 任务,generateJavadocs,来生成它们。
  使用 source 变量来指定源文件的位置。 你还应该更新 classpath 变量,以便该任务可以找到属于 Android SDK 的类。
 你可以通过把 android.getBootClasspath 方法的返回值添加给他,来这么做。
 */
task generateJavadocs(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

/*下一步,要从 Javadocs 生成 JAR,需要创建 Jar 任务,generateJavadocsJar
,并把 generateJavadocs 的 destinationDir 属性传递给它的 from 功能。
为了确保在 generateJavadocsJar 任务只在 generateJavadocs 任务完成后才开始,
需要添加下面的代码片段,它使用了 dependsOn 方法来决定任务的顺序:
您的新任务应如下所示:*/
task generateJavadocsJar(type: Jar, dependsOn: generateJavadocs) {
    from generateJavadocs.destinationDir
    classifier 'javadoc'
}

/*
 *第 6 步: 引入生成的 JAR 文件
 *为了把源和 Javadoc JAR 文件导入到 artifacts 的列表里,你应该把他们的任务的名字添加到 configuration 里,
 * 称为 archives,artifacts 列表将被上传到 Maven 仓库。 使用下面的代码片段来完成:
 */
artifacts {
    archives generateJavadocsJar
    archives generateSourcesJar
}

/*第 7 步: 运行任务
现在是运行我们在前几步里创建的任务的时候了。 打开 Gradle Projects 窗口,搜索名为 install 的任务。*/

/*
第 8 步: 配置 Bintray 插件
要配置插件,你应该使用 Gradle 文件中的 bintray 闭包。 首先,使用与你的 Bintray 用户名和 API 密钥对应的 user 和 key 变量进
行身份验证。在 Bintray,你的库会被放置在 Bintray package 里。 你应该使用 pkg 闭包里命名直观的 repo、 name、licenses 和
vcsUrl 参数,提供详细的相关信息, 如果这个包不存在,会为你自动创建。当你将文件上传到 Bintray 时,他们会与 Bintray 包里的一
个版本相关联。 因此,pkg 必须包含一个 version 闭包,闭包的 name 属性要设为独一无二的名称。 另外,你还可以使用 desc,
released 和 vcsTag参数来提供描述、 发布日期和 Git 标签。
最后,为了指定应该上传的文件,要把 configuration 参数的值设为 archives。
bintray {
    user = 'test-user'
    key = '01234567890abcdef01234567890abcdef'
    pkg {
        repo = 'maven'
        name = 'com.github.hathibelagal.mylittlelibrary'

        version {
            name = '1.0.1-tuts'
            desc = 'My test upload'
            released  = new Date()
            vcsTag = '1.0.1'
        }

        licenses = ['Apache-2.0']
        vcsUrl = 'https://github.com/hathibelagal/LibraryTutorial.git'
        websiteUrl = 'https://github.com/hathibelagal/LibraryTutorial'
    }
    configurations = ['archives']
}
 */
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
    user = properties.getProperty("BINTRAY_USER")
    key = properties.getProperty("BINTRAY_KEY")
    configurations = ['archives']
    pkg {
        repo = "maven"
        name = "MyHelloWorldLibrary"    //发布到JCenter上的项目名字

        version {
            name = '1.0.1-tuts'
            desc = 'My test upload'
            vcsTag = '1.0.0'
        }

        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}
/*
第 9 步: 使用 Bintray 插件上传文件
再次打开 Gradle Projects 窗口,搜索 bintrayUpload 任务。 双击它,启动上传文件。*/
/*
一旦任务完成,你就能打开浏览器来访问你的 Bintray 包的详细信息页面。 你会看到一个通知,
说你有四个未发布的文件。 如果要发布这些文件,单击 Publish 链接。 */
/*
* 使用 Bintray 里的库
你的库现在已经可以作为 Bintray 包使用了。 只要你分享了你的 Maven 仓库的 URL,加上 group ID、artifact ID 和 version number,
任何开发人员都可以访问你的库。 例如,为了使用我们刚才创建的库,开发人员必须引入下面这个代码片段:
repositories {
    maven {
        url 'https://dl.bintray.com/eruzza/maven'
    }
}
dependencies {
    compile 'com.github.hathibelagal.librarytutorial:mylittlelibrary:1.0.1@aar'
}
注意,在把库添加为 compile 依赖之前,
开发人员必须显式地在 repositories 列表里,引入你的仓库。*/

/*
 * Bintray的用户手册:https://bintray.com/docs/usermanual/
 */
上传成功

将库添加到 JCenter

默认情况下,Android Studio 会搜索一个名为 JCenter 的仓库里面的库。 如果你把自己的库引入到了 JCenter 存储库,开发人员就不必向他的 repositories 里添加任何东西了。

要将你的库添加到 JCenter,需要打开浏览器并访问你的 Bintray 的包的详细信息页面。 单击 Add to JCenter 按钮

接着你进入一个页面,让你填写一些信息。 你可以用 Comments 区域来提及任何关于这个库的细节。
单击 Send 按钮,启动 Bintray 的审查过程。 在一两天以内,Bintray 的工作人员会把你的库链接到 JCenter 仓库,这样你就将能在你的包的详细信息页面上,看到指向 JCenter 的链接了。
任何开发人员现在都可以使用你的库,而无需更改 repositories 列表。

通过后点击JCenter如图

使用

以后用到这个库的时候,只需要下面一句就可以了。是不是很爽,哈哈哈哈。

compile 'com.example:myfristlibrary:1.0.0'

项目地址:https://github.com/heinika/MyHelloWorldLibrary

补坑: gradle 的配置文件不要设置代理.
另外找不到问题的时候看命令行的日志.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • @synthesize和@dynamic分别有什么作用?@property有两个对应的词,一个是 @synthes...
    笔笔请求阅读 507评论 0 1
  • 猜想runloop内部是如何实现的?一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一...
    笔笔请求阅读 417评论 0 0
  • 今天文章的标题,第一个想到的是“平凡的一天”,当我想到自己有多少个平凡的一天啊!于是再仔细地想了想,改了这个标题。...
    大洪阅读 217评论 0 0
  • “你怎么总搬家?” 这是我将搬家的消息告诉朋友后,从不同的人嘴里听到的相同的回答。听到这个回应的时候,我的惊愕程度...
    我是小宇宙啊阅读 405评论 5 5
  • 集中思维和发散思维可以解决不同类型问题,但目前来看,同时只能有一种思维存在。 通过睡眠会促进神经元的生长。 对于拖...
    雪波阅读 1,704评论 0 3