論一個(gè)小白如何將自己的開(kāi)源庫(kù)發(fā)布到Bintray的JCenter上

在前一陣子的某一天,我不小心撞上了JitPack的版本升級(jí)而導(dǎo)致的JitPack炸了,于是無(wú)法把自己的庫(kù)發(fā)布成有效的開(kāi)源庫(kù),無(wú)奈之下,我終于下定決心轉(zhuǎn)戰(zhàn)隨緣發(fā)布的JCenter,開(kāi)啟了我為了發(fā)布放棄高數(shù),放棄大物,放棄現(xiàn)代,放棄離散的漫長(zhǎng)踩坑之路。。。

P.S.

  • 因?yàn)橹皼](méi)有發(fā)布過(guò)開(kāi)源庫(kù),所以這篇文章更適合小白。。。吧,至于大佬嘛。。。(額,你懂)
  • 在開(kāi)啟踩坑之路之前,我們要學(xué)會(huì)科(如)學(xué)(何)上(翻)網(wǎng)(墻)。

(不然的話(huà)GitHub和Bintray能卡死你)

踩坑一:在Bintray上注冊(cè)(這個(gè)真的是血淚史啊。。。務(wù)必看完再注冊(cè))

因?yàn)樵贐inatry版本升級(jí)后在注冊(cè)界面會(huì)有一個(gè)巨大的綠色框框,我想也沒(méi)想就注冊(cè)了,結(jié)果,發(fā)現(xiàn)自己注冊(cè)出來(lái)了一個(gè)團(tuán)隊(duì),但是你要是創(chuàng)建個(gè)人的開(kāi)源庫(kù)就要個(gè)人的賬號(hào),注冊(cè)在右上角的sign in ?。?!注冊(cè)地址點(diǎn)這里?。。?/a>

向前邁進(jìn):

注冊(cè)完了以后要生成自己的maven庫(kù),這個(gè)庫(kù)用來(lái)存放你的項(xiàng)目(閑扯一句,就算你的項(xiàng)目與JCenter注定無(wú)緣,不怕,只要在gradlel的build里面加上你maven庫(kù)的地址再加上你庫(kù)的依賴(lài),依然可以使用這個(gè)庫(kù))


踩坑二:maven的m的大小寫(xiě)

你的庫(kù)的類(lèi)型一定要選Maven名字一定要叫maven(因?yàn)锳S上傳Library時(shí)會(huì)默認(rèn)上傳到名叫maven類(lèi)型為Maven的庫(kù))

向前邁進(jìn):

新建完maven庫(kù)就要開(kāi)始新建上傳到Bintray的Library了,懷著無(wú)比激動(dòng)的心情想著自己很快就有第一個(gè)開(kāi)源庫(kù)了,然而事實(shí)證明之前的都在熱身,這才是開(kāi)始踩坑的血淚史。。。

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

(唔。。。接下來(lái)我的時(shí)間軸會(huì)有點(diǎn)混亂)我按照網(wǎng)上的流程寫(xiě)完了gradle里面的配置后,無(wú)比憧憬的等待Bintray審核通過(guò)的郵件,等了大概兩天吧,終于收到了成功加入JCenter的郵件,然后我把依賴(lài)加到項(xiàng)目里面,gradle的build也通過(guò)了,但是在Activity里面并找不到自己的類(lèi),后來(lái)某位大佬終于告訴了我真相:

把你想上傳的東西都要加在自己新建的Library里,而不是app里面(切到project模式可以看見(jiàn)),包括你的想上傳類(lèi),如果你的類(lèi)有自己定義的屬性或者用到了app/src/res/values的文件,也要一并加到library/src/res/values里面,因?yàn)殚_(kāi)源庫(kù)是不會(huì)上傳你app里的內(nèi)容。

那接下來(lái)我們就跳過(guò)Library里面類(lèi)什么都沒(méi)有的version1,以及default-pom.xml莫名無(wú)法生成的version2(中間會(huì)稍微提一下解決方法),直接到成功發(fā)布的version3好了.P.S.如果AS在每次打開(kāi)時(shí)都會(huì)在右上角提醒你更新的話(huà)(老版的settings里面沒(méi)有Android SDK也很不方便),先更新吧,因?yàn)槲覀兘酉聛?lái)的配置都用的是最新的版本,如果更新完,又提醒你更新Plugin也一起更新吧


如果在更新時(shí)是這個(gè)報(bào)錯(cuò),建議你去設(shè)置網(wǎng)絡(luò)代理,這個(gè)網(wǎng)上的解決方案很多,或者看我的另一篇博客(正在更),我就不贅述了。。。

繼續(xù)向前:

新建Library。右鍵點(diǎn)application,然后選New->Moudle->(在彈出來(lái)的提示框里選)Android Library就可以了。


至于Library的名字,你隨意吧,但是別起和你application很像的名字,也別起和你項(xiàng)目沒(méi)什么關(guān)系的名字,因?yàn)間radle依賴(lài)?yán)锩鏁?huì)有一部分是Library的名字。

這里我講解一下Gradle依賴(lài)的每一部分的來(lái)歷:

  1. 首先把你要傳的類(lèi)放在你Library->src->main->java件夾的下面(注意,我切的是Project的模式)。
  2. 如果你的類(lèi)有自定義的屬性,要把相應(yīng)的attrs.xml文件移到你Library->src->res->values文件夾下面(如果你的類(lèi)涉及到app中values的colors什么什么的文件,建議也一起加到你Library下面,在Library中加Values文件夾下面的文件時(shí),最好新建,不要去把a(bǔ)pp中的拖到Library里面,因?yàn)锽uild的時(shí)候可能報(bào)錯(cuò)
  3. 最后我們我們把這些都準(zhǔn)備好后,就可以Share Project On GitHub了。當(dāng)然了,至于怎么在AS上把項(xiàng)目推到GitHub上我就不多說(shuō)了,網(wǎng)上搜一搜教程很多的,當(dāng)你上傳成功以后你就會(huì)看見(jiàn)你AS的右上角會(huì)有一個(gè)上傳成功的提示,這個(gè)時(shí)候你就可以去你的GitHub上看你的項(xiàng)目了
  4. 至于我gradle里免得配置基本上都是參考的這篇博客的: AndroidStuio快速發(fā)布開(kāi)源項(xiàng)目到Jcenter/Bintray.那下面我就直接貼代碼嘍。
  • 配置項(xiàng)目的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文件(務(wù)必仔細(xì)閱讀注釋?zhuān)糠謧€(gè)人信息的修改都寫(xiě)在了注釋里了!)

    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"
           // 這一行要?jiǎng)h除, 因?yàn)閘ibrary不允許有applicationId。
           minSdkVersion 8
           targetSdkVersion 23
           versionCode 1
           versionName '1.0.1'
      }
     }
    dependencies {
    // 如果你的library有依賴(lài)別的jar,這里要把jar依賴(lài)進(jìn)來(lái)。
    compile fileTree(dir: 'libs', includes: ['*.jar'])
    }
    
    // 項(xiàng)目引用的版本號(hào),比如compile    
    // 'com.yanzhenjie:andserver:1.0.1'中的1.0.1就是這里配置的。
    version = "1.0.1"
    
    // 定義兩個(gè)鏈接,下面會(huì)用到。
    def siteUrl = 'https://github.com/yanzhenjie/AndServer' // 項(xiàng)目主頁(yè)。
    def gitUrl = 'git@github.com:yanzhenjie/AndServer.git' // Git倉(cāng)庫(kù)的url。
    
    // 唯一包名,比如compile 'com.yanzhenjie:andserver:1.0.1'中的     com.yanzhenjie就是這里配置的。
    group = "com.yanzhenjie"
    install {
       repositories.mavenInstaller {
       // 生成pom.xml和參數(shù)
       pom {
           project {
               packaging 'aar'
               // 項(xiàng)目描述,復(fù)制我的話(huà),這里需要修改。
               name 'AndServer For Android'// 可選,項(xiàng)目名稱(chēng)。
               description 'The Android build the framework of the Http server.'// 可選,項(xiàng)目描述。
               url siteUrl // 項(xiàng)目主頁(yè),這里是引用上面定義好。
    
               // 軟件開(kāi)源協(xié)議,現(xiàn)在一般都是Apache License2.0吧,復(fù)制我的,這里不需要修改。
              licenses {
                  license {
                     name 'The Apache Software License, Version 2.0'
                     url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                  }
               }
    
               //填寫(xiě)開(kāi)發(fā)者基本信息,復(fù)制我的,這里需要修改。
               developers {
                  developer {
                      id 'yanzhenjie' // 開(kāi)發(fā)者的id。
                      name 'yanzhenjie' // 開(kāi)發(fā)者名字。
                      email 'smallajax@foxmail.com' // 開(kāi)發(fā)者郵箱。
                   }
               }
    
               // SCM,復(fù)制我的,這里不需要修改。
               scm {
                   connection gitUrl // Git倉(cāng)庫(kù)地址。
                   developerConnection gitUrl // Git倉(cāng)庫(kù)地址。
                   url siteUrl // 項(xiàng)目主頁(yè)。
              }
           }
        }
       }
     }
    // 生成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 // 忽略注釋語(yǔ)法錯(cuò)誤,如果用jdk1.8你的注釋寫(xiě)的不規(guī)范就編譯不過(guò)。
    }
    // 生成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的用戶(hù)名。
        key = properties.getProperty("bintray.apikey") // Bintray剛才保存的     ApiKey。
    
        configurations = ['archives']
        pkg {
            repo = "maven"  // 上傳到maven庫(kù)。(這里要特別注意,如果寫(xiě)了maven報(bào)404錯(cuò)誤,請(qǐng)?jiān)赽intray創(chuàng)建一個(gè)倉(cāng)庫(kù),這里填改成你創(chuàng)建的倉(cāng)庫(kù)的名字,如何創(chuàng)建請(qǐng)看下圖。)
            name = "andserver"  // 發(fā)布到Bintray上的項(xiàng)目名字,這里的名字不是compile 'com.yanzhenjie:andserver:1.0.1'中的andserver。
            userOrg = 'bintray_user' // Bintray的用戶(hù)名。
            websiteUrl = siteUrl
            vcsUrl = gitUrl
            licenses = ["Apache-2.0"]
            publish = true // 是否是公開(kāi)項(xiàng)目。
       }
    }
    
  • 說(shuō)一下可能有疑問(wèn)的地方:

  • APIKey和user存放和讀?。?/strong>
    因?yàn)槲覀兩蟼黜?xiàng)目到github上的時(shí)候會(huì)把gradle文件傳上去,所以不要把帳號(hào)密碼的信息直接寫(xiě)在這里,寫(xiě)在local.properties中,這里動(dòng)態(tài)讀取。
  • 那么問(wèn)題來(lái)了,apikey在哪里找呢還有上面的git倉(cāng)庫(kù)又在哪里找呢?
  1. 先說(shuō)一下apikey:

  2. git倉(cāng)庫(kù)地址:
    首先打開(kāi)你項(xiàng)目在GitHub里的頁(yè)面,然后點(diǎn)左邊的一個(gè)綠色的一個(gè)Clone or download的框框,然后把它切換到SSH,這時(shí)現(xiàn)實(shí)的就是你git倉(cāng)庫(kù)的地址


把Library上傳到Bintray上

  • 首先我建議把你的項(xiàng)目在AS上再朝GitHub那邊Commit and Push一次,然后就可以準(zhǔn)備傳到Bintray
  • 完成了以后,打開(kāi)AS的Terminal控制臺(tái),在里面輸入這兩句(分開(kāi)輸)
      gradew install                              //系統(tǒng)配置gradle的用戶(hù)環(huán)境
      gradew bintrayUpload                        //上傳到Bintray

或者在AS的右邊有一個(gè)Gradle,用里面的插件bintrayUpload來(lái)上傳也可以,但是要切到gradle控制臺(tái)里看是否BUILD SUCCESSFUL.
(感覺(jué)命令行更好用些)

去你Bintray的maven倉(cāng)庫(kù)下進(jìn)行確認(rèn)是否上傳成功

如果你到Bintray上發(fā)現(xiàn)你的項(xiàng)目存在,但是下面沒(méi)有Gradle的依賴(lài),大概就像這樣:
正常的庫(kù)


不正常的庫(kù)(假裝有圖)

這個(gè)。。。由于換電腦的原因,之前留的圖片全都沒(méi)備份就把上一個(gè)電腦的系統(tǒng)重裝了(啊啊啊,暴風(fēng)式哭泣。。。
總之就是,上面那張圖的最下面的gradle可以復(fù)制的一段代碼消失了,沒(méi)有可以導(dǎo)入的庫(kù)的代碼

如果有可復(fù)制的依賴(lài)代碼,那么說(shuō)明你的庫(kù)就已經(jīng)上傳成功啦,要是沒(méi)有的話(huà)建議去看一下Android Studio 的gradle控制臺(tái)在run的時(shí)候有沒(méi)有報(bào)錯(cuò),比如說(shuō)哪一個(gè)文件沒(méi)有生成或者生成的時(shí)候出現(xiàn)了問(wèn)題之類(lèi)的。

最后一步:添加到j(luò)center,提交給管理員審核

最后一步最關(guān)鍵的審核你和管理員的緣分(哈哈哈,開(kāi)玩笑的)其實(shí)我感覺(jué)我都還好,沒(méi)遇到傳說(shuō)中審核沒(méi)通過(guò)的事情,基本上提交了以后等一陣子(一般是1~3天都會(huì)有回復(fù),如果沒(méi)有通過(guò)我記得會(huì)給原因。。。吧)

提交步驟很簡(jiǎn)單,在頁(yè)面左側(cè)有一個(gè) Linked to(0), 然后你只要點(diǎn)下面的Add to JCenter 按鈕就可以,然后在彈出的提交界面寫(xiě)上對(duì)應(yīng)的信息就好啦,然后就可以等管理員審核過(guò)后給你在Binary上綁定的郵箱里面發(fā)通知郵件咯

啰嗦一些可能遇見(jiàn)的小問(wèn)題

  • 如果報(bào)錯(cuò)了建議先去看gradle控制臺(tái)的運(yùn)行記錄,看里面有沒(méi)有什么異常

  • 關(guān)于default-pom.xml莫名無(wú)法生成 :
    這一個(gè)問(wèn)題我一般是直接刪掉之前放開(kāi)源庫(kù)相應(yīng)代碼的package,然后直接新建一個(gè)package,名字要和之前的package一樣,但是在build.gradle 里面的version(即版本號(hào))要改一個(gè)新的版本號(hào),然后也是上面的步驟再重復(fù)一遍。

    但是在有一篇博客里提到了關(guān)于default-pom.xml無(wú)法生成的解決方法,要是嫌上面的方法麻煩的話(huà),可以看一下解決方法(我沒(méi)有試過(guò))。

然后基本上就是這些啦,要是還有什么為問(wèn)題的話(huà)可以在評(píng)論區(qū)留言呀。

這是我第一次寫(xiě)博客,啰里八嗦說(shuō)了一大堆,措辭也要改進(jìn),而且自己也拖了好久,唉,感覺(jué)自己好菜啊,如果有什么不足之處希望大家直接說(shuō)好了,我是一個(gè)耿直girl,不會(huì)介意的,最后就是蟹蟹大家能一直看到最后,又聽(tīng)我啰里八嗦一大堆。

哈哈(尬笑

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容