论一个小白如何将自己的开源库发布到Bintray的JCenter上

在前一阵子的某一天,我不小心撞上了JitPack的版本升级而导致的JitPack炸了,于是无法把自己的库发布成有效的开源库,无奈之下,我终于下定决心转战随缘发布的JCenter,开启了我为了发布放弃高数,放弃大物,放弃现代,放弃离散的漫长踩坑之路。。。

P.S.

  • 因为之前没有发布过开源库,所以这篇文章更适合小白。。。吧,至于大佬嘛。。。(额,你懂)
  • 在开启踩坑之路之前,我们要学会科(如)学(何)上(翻)网(墙)。

(不然的话GitHub和Bintray能卡死你)

踩坑一:在Bintray上注册(这个真的是血泪史啊。。。务必看完再注册)

因为在Binatry版本升级后在注册界面会有一个巨大的绿色框框,我想也没想就注册了,结果,发现自己注册出来了一个团队,但是你要是创建个人的开源库就要个人的账号,注册在右上角的sign in !!!注册地址点这里!!!

向前迈进:

注册完了以后要生成自己的maven库,这个库用来存放你的项目(闲扯一句,就算你的项目与JCenter注定无缘,不怕,只要在gradlel的build里面加上你maven库的地址再加上你库的依赖,依然可以使用这个库)


踩坑二:maven的m的大小写

你的库的类型一定要选Maven名字一定要叫maven(因为AS上传Library时会默认上传到名叫maven类型为Maven的库)

向前迈进:

新建完maven库就要开始新建上传到Bintray的Library了,怀着无比激动的心情想着自己很快就有第一个开源库了,然而事实证明之前的都在热身,这才是开始踩坑的血泪史。。。

踩坑三:如何新建Library以及Library下面该放些什么

(唔。。。接下来我的时间轴会有点混乱)我按照网上的流程写完了gradle里面的配置后,无比憧憬的等待Bintray审核通过的邮件,等了大概两天吧,终于收到了成功加入JCenter的邮件,然后我把依赖加到项目里面,gradle的build也通过了,但是在Activity里面并找不到自己的类,后来某位大佬终于告诉了我真相:

把你想上传的东西都要加在自己新建的Library里,而不是app里面(切到project模式可以看见),包括你的想上传类,如果你的类有自己定义的属性或者用到了app/src/res/values的文件,也要一并加到library/src/res/values里面,因为开源库是不会上传你app里的内容。

那接下来我们就跳过Library里面类什么都没有的version1,以及default-pom.xml莫名无法生成的version2(中间会稍微提一下解决方法),直接到成功发布的version3好了.P.S.如果AS在每次打开时都会在右上角提醒你更新的话(老版的settings里面没有Android SDK也很不方便),先更新吧,因为我们接下来的配置都用的是最新的版本,如果更新完,又提醒你更新Plugin也一起更新吧


如果在更新时是这个报错,建议你去设置网络代理,这个网上的解决方案很多,或者看我的另一篇博客(正在更),我就不赘述了。。。

继续向前:

新建Library。右键点application,然后选New->Moudle->(在弹出来的提示框里选)Android Library就可以了。


至于Library的名字,你随意吧,但是别起和你application很像的名字,也别起和你项目没什么关系的名字,因为gradle依赖里面会有一部分是Library的名字。

这里我讲解一下Gradle依赖的每一部分的来历:

  1. 首先把你要传的类放在你Library->src->main->java件夹的下面(注意,我切的是Project的模式)。
  2. 如果你的类有自定义的属性,要把相应的attrs.xml文件移到你Library->src->res->values文件夹下面(如果你的类涉及到app中values的colors什么什么的文件,建议也一起加到你Library下面,在Library中加Values文件夹下面的文件时,最好新建,不要去把app中的拖到Library里面,因为Build的时候可能报错
  3. 最后我们我们把这些都准备好后,就可以Share Project On GitHub了。当然了,至于怎么在AS上把项目推到GitHub上我就不多说了,网上搜一搜教程很多的,当你上传成功以后你就会看见你AS的右上角会有一个上传成功的提示,这个时候你就可以去你的GitHub上看你的项目了
  4. 至于我gradle里免得配置基本上都是参考的这篇博客的: AndroidStuio快速发布开源项目到Jcenter/Bintray.那下面我就直接贴代码喽。
  • 配置项目的gradle:
 buildscript {
    repositories {
        jcenter()
 }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        // 添加下面两行代码即可。
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
        //就上面的这两行
    }
 }

 allprojects {
     repositories {
        jcenter()
    }
 }

 task clean(type: Delete) {
    delete rootProject.buildDir
 }
  • 配置Library里面的gradle文件(务必仔细阅读注释,部分个人信息的修改都写在了注释里了!)

    apply plugin: 'com.android.library'
    // 这里添加下面两行代码。
    apply plugin: 'com.github.dcendents.android-maven'
    apply plugin: 'com.jfrog.bintray'
    
    android {
       compileSdkVersion 23
       buildToolsVersion "23.0.3"
       resourcePrefix "andserver_res_"
    
       defaultConfig {
            // applicationId "com.yanzhenjie.andserver.sample"
           // 这一行要删除, 因为library不允许有applicationId。
           minSdkVersion 8
           targetSdkVersion 23
           versionCode 1
           versionName '1.0.1'
      }
     }
    dependencies {
    // 如果你的library有依赖别的jar,这里要把jar依赖进来。
    compile fileTree(dir: 'libs', includes: ['*.jar'])
    }
    
    // 项目引用的版本号,比如compile    
    // 'com.yanzhenjie:andserver:1.0.1'中的1.0.1就是这里配置的。
    version = "1.0.1"
    
    // 定义两个链接,下面会用到。
    def siteUrl = 'https://github.com/yanzhenjie/AndServer' // 项目主页。
    def gitUrl = 'git@github.com:yanzhenjie/AndServer.git' // Git仓库的url。
    
    // 唯一包名,比如compile 'com.yanzhenjie:andserver:1.0.1'中的     com.yanzhenjie就是这里配置的。
    group = "com.yanzhenjie"
    install {
       repositories.mavenInstaller {
       // 生成pom.xml和参数
       pom {
           project {
               packaging 'aar'
               // 项目描述,复制我的话,这里需要修改。
               name 'AndServer For Android'// 可选,项目名称。
               description 'The Android build the framework of the Http server.'// 可选,项目描述。
               url siteUrl // 项目主页,这里是引用上面定义好。
    
               // 软件开源协议,现在一般都是Apache License2.0吧,复制我的,这里不需要修改。
              licenses {
                  license {
                     name 'The Apache Software License, Version 2.0'
                     url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                  }
               }
    
               //填写开发者基本信息,复制我的,这里需要修改。
               developers {
                  developer {
                      id 'yanzhenjie' // 开发者的id。
                      name 'yanzhenjie' // 开发者名字。
                      email 'smallajax@foxmail.com' // 开发者邮箱。
                   }
               }
    
               // SCM,复制我的,这里不需要修改。
               scm {
                   connection gitUrl // Git仓库地址。
                   developerConnection gitUrl // Git仓库地址。
                   url siteUrl // 项目主页。
              }
           }
        }
       }
     }
    // 生成jar包的task,不需要修改。
    task sourcesJar(type: Jar) {
       from android.sourceSets.main.java.srcDirs
       classifier = 'sources'
    }
    // 生成jarDoc的task,不需要修改。
    task javadoc(type: Javadoc) {
        source = android.sourceSets.main.java.srcDirs
        classpath +=       project.files(android.getBootClasspath().join(File.pathSeparator))
        // destinationDir = file("../javadoc/")
        failOnError false // 忽略注释语法错误,如果用jdk1.8你的注释写的不规范就编译不过。
    }
    // 生成javaDoc的jar,不需要修改。
    task javadocJar(type: Jar, dependsOn: javadoc) {
        classifier = 'javadoc'
        from javadoc.destinationDir
    }
    artifacts {
        archives javadocJar
        archives sourcesJar
    }
    
    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties').newDataInputStream())
    bintray {
        user = properties.getProperty("bintray.user") // Bintray的用户名。
        key = properties.getProperty("bintray.apikey") // Bintray刚才保存的     ApiKey。
    
        configurations = ['archives']
        pkg {
            repo = "maven"  // 上传到maven库。(这里要特别注意,如果写了maven报404错误,请在bintray创建一个仓库,这里填改成你创建的仓库的名字,如何创建请看下图。)
            name = "andserver"  // 发布到Bintray上的项目名字,这里的名字不是compile 'com.yanzhenjie:andserver:1.0.1'中的andserver。
            userOrg = 'bintray_user' // Bintray的用户名。
            websiteUrl = siteUrl
            vcsUrl = gitUrl
            licenses = ["Apache-2.0"]
            publish = true // 是否是公开项目。
       }
    }
    
  • 说一下可能有疑问的地方:

  • APIKey和user存放和读取:
    因为我们上传项目到github上的时候会把gradle文件传上去,所以不要把帐号密码的信息直接写在这里,写在local.properties中,这里动态读取。
  • 那么问题来了,apikey在哪里找呢还有上面的git仓库又在哪里找呢?
  1. 先说一下apikey:

  2. git仓库地址:
    首先打开你项目在GitHub里的页面,然后点左边的一个绿色的一个Clone or download的框框,然后把它切换到SSH,这时现实的就是你git仓库的地址


把Library上传到Bintray上

  • 首先我建议把你的项目在AS上再朝GitHub那边Commit and Push一次,然后就可以准备传到Bintray
  • 完成了以后,打开AS的Terminal控制台,在里面输入这两句(分开输)
      gradew install                              //系统配置gradle的用户环境
      gradew bintrayUpload                        //上传到Bintray

或者在AS的右边有一个Gradle,用里面的插件bintrayUpload来上传也可以,但是要切到gradle控制台里看是否BUILD SUCCESSFUL.
(感觉命令行更好用些)

去你Bintray的maven仓库下进行确认是否上传成功

如果你到Bintray上发现你的项目存在,但是下面没有Gradle的依赖,大概就像这样:
正常的库


不正常的库(假装有图)

这个。。。由于换电脑的原因,之前留的图片全都没备份就把上一个电脑的系统重装了(啊啊啊,暴风式哭泣。。。
总之就是,上面那张图的最下面的gradle可以复制的一段代码消失了,没有可以导入的库的代码

如果有可复制的依赖代码,那么说明你的库就已经上传成功啦,要是没有的话建议去看一下Android Studio 的gradle控制台在run的时候有没有报错,比如说哪一个文件没有生成或者生成的时候出现了问题之类的。

最后一步:添加到jcenter,提交给管理员审核

最后一步最关键的审核你和管理员的缘分(哈哈哈,开玩笑的)其实我感觉我都还好,没遇到传说中审核没通过的事情,基本上提交了以后等一阵子(一般是1~3天都会有回复,如果没有通过我记得会给原因。。。吧)

提交步骤很简单,在页面左侧有一个 Linked to(0), 然后你只要点下面的Add to JCenter 按钮就可以,然后在弹出的提交界面写上对应的信息就好啦,然后就可以等管理员审核过后给你在Binary上绑定的邮箱里面发通知邮件咯

啰嗦一些可能遇见的小问题

  • 如果报错了建议先去看gradle控制台的运行记录,看里面有没有什么异常

  • 关于default-pom.xml莫名无法生成 :
    这一个问题我一般是直接删掉之前放开源库相应代码的package,然后直接新建一个package,名字要和之前的package一样,但是在build.gradle 里面的version(即版本号)要改一个新的版本号,然后也是上面的步骤再重复一遍。

    但是在有一篇博客里提到了关于default-pom.xml无法生成的解决方法,要是嫌上面的方法麻烦的话,可以看一下解决方法(我没有试过)。

然后基本上就是这些啦,要是还有什么为问题的话可以在评论区留言呀。

这是我第一次写博客,啰里八嗦说了一大堆,措辞也要改进,而且自己也拖了好久,唉,感觉自己好菜啊,如果有什么不足之处希望大家直接说好了,我是一个耿直girl,不会介意的,最后就是蟹蟹大家能一直看到最后,又听我啰里八嗦一大堆。

哈哈(尬笑

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

推荐阅读更多精彩内容