V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jpush
V2EX  ›  Android

发布 Android Library 到 JCenter 从入门到放弃

  •  
  •   jpush · 2017-05-25 14:43:33 +08:00 · 7619 次点击
    这是一个创建于 2768 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近想倒腾一个小小的 UIKit 到 JCenter,为开源社区贡献一点绵薄之力,于是就有了一系列惨无人道的踩坑史。好,接下来,直奔主题,以下是发布流程。

    发布到 JCenter

    发布到 JCenter 需要以下几个步骤。

    注册 Bintray 账号并创建仓库

    Bintray 是 JCenter 库的运营商,首先要去这个网站注册一下账号 https://bintray.com/signup/oss

    网上大多数教程会把你带到注册企业账号的地方,这是第一个坑。

    注册完后创建一个仓库:

    填写一下必填项即可:

    在 Type 处选择 Maven。接下来创建一个 Package:

    注意下 name 这一栏

    填上你要发布的 Library 项目的名字。完成之后大概是这样的:

    插件配置

    网上有很多教程是用 android-maven-gradle 插件来发布 Library,甚至是官方推荐的 gradle-bintray-plugin,其实这两个配置都比较复杂。下面要推荐的是 bintray-release 插件,配置非常简单。首先在项目的 build.gradle 加上:

    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.2.3'
            classpath 'com.novoda:bintray-release:0.4.0'
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    

    然后打开 Library 的 build.gradle,加入:

    apply plugin: 'com.android.library'
    apply plugin: 'com.novoda.bintray-release'
    
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.0"
        defaultConfig {
            minSdkVersion 16
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    
        lintOptions {
            abortOnError false
        }
    }
    
    publish {
        userOrg = 'KenChoi1992' // 改成你在 bintray 上注册的用户名
        groupId = 'cn.jiguang.imui' // 改成你的包名(影响别人引用的第一段)
        artifactId = 'chatinput' // 改成你的 Library 名字(影响别人引用的第二段)
        publishVersion = '0.0.1' // 版本号 (影响别人引用的第三段)
        desc = 'im uikit'
        website = 'https://github.com/jpush/imui.git'
    }
    

    完成了上面的配置之后,别人要引用你的 Library,就可以这样:

    // 由 groupId,artifcatId,version 三段组成
    compile 'cn.jiguang.imui:chatinput:0.0.1'
    

    检查代理

    在执行下一步之前,请确保 Android Studio 正确的配置了代理,因为大天朝要科学上网,你懂的。打开 Android Studio 的配置菜单:

    点上面的 Check connection,在弹出的窗口输入一个墙外网站:

    然后点击 OK,如果成功了,是这样的:

    运行任务

    最后在 Android Studio 的终端运行:

    ./gradlew clean build bintrayUpload -PbintrayUser=Username -PbintrayKey=ApiKey -PdryRun=false
    

    将上面的用户名改成自己的,ApiKey 是从 bintray 网站上得到的: 点击 Edit Profile,进入编辑资料界面:

    然后点击 API Key 即可查看:

    如果执行完上述命令后,成功了,那么恭喜你!你顺利地发布了自己的 Library,在别人的项目中,只要用一行代码就可以引用你的库,实在是高(装)端(逼)大(必)气(备),上档次!请注意,如果失败了,前方高能!非战斗人员撤退!

    如果你失败了!请不要惊讶,因为我也失败了!!失败的原因有很多,但是尝试了许多解决方案之后,终于!……我放弃了!!而且尝试了上述的三个插件都失败了!!!所以我并不是标题党……但是!尽管如此,如果轻易放弃,不是吾辈所为!所以我决定手!动!上!传!

    说是手动上传,其实也用到了一个工具 release-android-library,在 Library 的 build.gradle 中配置一下:

    apply plugin: 'com.android.library'
    
    ext {
        PUBLISH_GROUP_ID = 'cn.jiguang.imui'
        PUBLISH_ARTIFACT_ID = 'chatinput'
        PUBLISH_VERSION = '0.0.1'
    }
    
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.0"
        defaultConfig {
            minSdkVersion 16
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    
        lintOptions {
            abortOnError false
        }
    }
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.1.1'
        compile 'com.android.support:design:25.1.1'
        compile 'com.google.android:flexbox:0.2.5'
        compile 'com.github.bumptech.glide:glide:3.7.0'
        compile 'com.android.support:support-v4:25.1.1'
        testCompile 'junit:junit:4.12'
    }
    
    apply from: 'https://raw.githubusercontent.com/blundell/release-android-library/master/android-release-aar.gradle'
    

    主要是加入 ext 和 apply from 这两个相关内容即可。然后在终端中执行命令:

    ./gradlew clean build generateRelease
    

    完成后,在 build 文件夹下就会生成一个压缩文件:

    回到 bintray 的 package 下,点击 New Version:

    然后创建一个 version,名字和你要发布的版本号一致,然后点击确定,接着点击上传文件按钮:

    在页面中上传刚才的压缩文件:

    请注意上面红色方框,一!定!要!勾选这个 Checkbox,否则会发生奇妙的错误,别问我怎么知道的!

    然后点击 Save Changes,接着点击页面中的 Publish 按钮,这样就发布了!

    接着回到 Package,将 Library 发布到 JCenter。

    点击 Add to JCenter,点击后输入一下评论,然后点击 OK 即可,等待几个小时后的审核就可以了。到此为止,我们已经完成了发布!但是!你以为这就完了?接下来介绍一个快捷,简单到令人发指的开源仓库:JitPack

    发布到 JitPack

    打开 JitPack 网站,使用 GitHub 账号登录即可,很方便,只需要简单的两步即可发布到 JitPack。

    • 在 GitHub 上发布一个版本

    • 把 GitHub 的仓库地址粘贴到 JitPack,然后点击 Look up 按钮:

    然后在从下面的列表中选择一个版本,然后点击 Get it 即可!接下来,别人只需要在项目的 build.gradle 中加入:

    	allprojects {
    		repositories {
    			...
    			maven { url 'https://jitpack.io' }
    		}
    	}
    

    然后在 Module 的 build.gradle 中引用即可:

    	dependencies {
    		compile 'com.github.User:Repo:Tag'
    	}
    

    就是这样,so easy !

    总结

    目前来说 JCenter 虽然是 Android 的默认仓库,但是发布的流程还是比较麻烦,而且发布的过程是一个闻者伤心,见者流泪的辛酸血泪填坑史。JitPack 更加简单快捷,使用的方式也相差无几。顺便一提,文中的 chatinput 是一个 IM UIKit,可以方便地为聊天界面集成文字,录音、发图片、视频消息。另外我们也发布了 imui,可以方便地集成聊天界面功能,使用方式:

    compile 'cn.jiguang.imui:imui:0.0.1'
    

    更多信息请登录我们的 GitHub 地址: https://github.com/jpush/imui 后续我们也会不断地完善和维护,欢迎大家提 PR。


    作者:KenChoi - 极光( JPush 为极光开发者团队账号,欢迎关注)

    原文:发布 Android Library 到 JCenter 从入门到放弃

    知乎专栏:极光日报

    3 条回复    2017-06-07 10:54:49 +08:00
    xiaoshenke
        1
    xiaoshenke  
       2017-05-26 11:56:46 +08:00
    码 一直没成功的路过。。
    theworldsong
        2
    theworldsong  
       2017-05-27 10:26:54 +08:00
    曾经也折腾了很久————

    根本问题在于,中文教程 90%以上是相互抄袭。

    看英文教程就好多了。
    lrannn
        3
    lrannn  
       2017-06-07 10:54:48 +08:00
    前几天在折腾来着,不过还好已经 OK 了🤓遗憾就是 artifactId 不知道为啥是默认的"library"
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   887 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 22:19 · PVG 06:19 · LAX 14:19 · JFK 17:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.