在Jcenter上快速共享你的Android 項目(Java or Kotlin)

背景

開發過程當中,若是你寫了一個工具類,想給其餘項目使用的話,一般都是將它抽到lib目錄供其餘項目使用: java

在這裏插入圖片描述

而後在調用項目下引入相關的Lib: react

在這裏插入圖片描述

問題

那若是想使用的項目和咱們公用的lib不在一個目錄呢?按照之前老的方式,譬如拷貝文件,打包jar的方式雖然又不是不能用,可是不只便於維護和修改,若是每次改動,每一個地方都要操做造做一遍,並且若是有資源文件就更麻煩了,那麼能不能跟第三方開源庫同樣:一個地方完成修改,引用到的地方一行代碼就能解決?android

像這樣:
implementation "io.reactivex.rxjava2:rxjava:2.x.y"
複製代碼

方案固然是有的,網上也有不少現成方案,我這邊精簡和整理了一下,今天就給你們一個步驟模板,方便你們快速發佈和共享本身的代碼,少踩坑和走彎路。git

上傳Java 代碼到 Jcenter

主要步驟(全程推薦在代理下完成,否則會很慢或者不成功、帶框部分是重點項):

這裏注意要註冊右邊的開源帳號,千萬注意不要註冊成左邊的綠色按鈕了,後面會很麻煩。 github

在這裏插入圖片描述

  • 註冊成功以後,在本身的Profile中記住本身的Api key,待會上傳要用:
    在這裏插入圖片描述
  • 新建一個倉庫,這個倉庫就是咱們託管代碼的地方

在這裏插入圖片描述
2.
在這裏插入圖片描述

  • 在剛剛的倉庫(Respository)繼續建立一個包(Packge),好比我如今準備把項目中tools裏面的代碼傳到這個包中,我就這麼建立:
    在這裏插入圖片描述
    versionControl儘可能寫一個git結尾的連接,不然容易審覈失敗

到目前爲止,個人準備工做已經基本到位,回顧一下幾個關鍵信息:web

  1. 倉庫名:TestRepository
  2. 包名: MyTools
  3. 用戶名: soulqw (屆時替換爲你本身的)
  4. Api key:xxxxxxxx (屆時替換爲你本身的)
  • 回到咱們的項目作一些模板配置
  1. 在咱們的項目的根部 gradle文件中添加以下配置:
dependencies {
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
    }
複製代碼
  1. 回到咱們須要傳的目錄,這裏即咱們的tools目錄,在它的gradle文件中添加以下:
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'

def siteUrl = 'https://www.google.com/' //可選 若是有的話

def gitUrl = 'https://www.google.com/' //可選 若是有的話

group = "com.share"  //路徑
version = "0.0.2.release" //版本名稱, 不要用beta,不然容易審覈不經過
//以上兩個配合項目目錄名最終上傳上去引用就是 compile 'com.share:tools:0.0.2.release'

task 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))
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

task copyDoc(type: Copy) {
    from "${buildDir}/docs/"
    into "docs"
}

artifacts {
    archives javadocJar
    archives sourcesJar
}

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging 'aar'
                name 'is permission tool for android'
                url siteUrl
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id 'soulqw' //用戶名
                        name 'qinwei' //姓名
                        email 'cd5160866@126.com' //郵箱
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }
        }
    }
}

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

bintray {
    //關鍵信息咱們從localProperties文件中讀取
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")
    configurations = ['archives']
    pkg {
        repo = "TestRepository" // 倉庫名
        name = "MyTools"// 包名
        desc = 'just tools'
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}

javadoc {
    options {
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version true
        links "http://docs.oracle.com/javase/7/docs/api"
    }
}
複製代碼

上面填入了咱們須要傳項目的版本號,其中group、version、和項目目錄合併起來的終樣式規則以下: apache

在這裏插入圖片描述
最後後在localProperties文件中填入咱們的用戶名和ApiKey:
在這裏插入圖片描述
完成以上步驟之後,打開終端到項目目錄下,輸入:

./gradlew install bintrayUpload

複製代碼

而後成功以下: api

在這裏插入圖片描述

再來看看咱們傳上去的庫 markdown

在這裏插入圖片描述
那麼咱們最終的引用方式就是:

dependencies {
// implementation project(':tools')
    implementation 'com.share:tools:0.0.2.release'
}


複製代碼

注意:oracle

  • 必定要在全局代理下完成整個上傳過程
  • 一個版本被成功傳上去之後,就不能再更改,若是須要改的話,修改代碼從新改版本名稱便可從新上傳,如0.0.2.release,(儘可能使用realease或者純版本號,不然容易審覈被拒)
  • 如今傳上去之後還不能被直接引用,須要Add to Jcenter ,審覈經過後便可
    在這裏插入圖片描述

描述儘可能填寫就好,通常幾個小時到一兩天就審覈經過可用了。 若是審覈被拒絕,會跟你描述爲什麼被拒絕,按照他的要求再次修改並回復郵件,便可從新審覈:

在這裏插入圖片描述

一旦審覈經過,後續只要修改版本名稱的迭代都不須要再次審覈了

  • 若是你的Lib本身項目中依賴了某個庫,好比Android Support庫
dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'
}
複製代碼

而你應用的項目也使用了這個庫,可是它們各自所依賴的版本號不一致,這樣應用項目在引入這個lib時候編輯就容易因版本號不一致而報錯,正確的姿式就是講lib對 相應庫的依賴由 implementation 改成 compileOnly 或者由 compile 改成 provided

dependencies {
    //這樣引用容易引起衝突,改成compileOnly 僅僅lib內可用
// implementation 'com.android.support:appcompat-v7:28.0.0'
    compileOnly 'com.android.support:appcompat-v7:28.0.0'
}

複製代碼

如下是幾個gradle中新老配置的變化對照表:

新配置 老配置 行爲
implementation compile 依賴項在編譯時對模塊可用,而且僅在運行時對模塊的消費者可用。 對於大型多項目構建,使用 implementation 而不是 api/compile 能夠顯著縮短構建時間,由於它能夠減小構建系統須要從新編譯的項目量。 大多數應用和測試模塊都應使用此配置。
api compile 依賴項在編譯時對模塊可用,而且在編譯時和運行時還對模塊的消費者可用。 此配置的行爲相似於 compile(如今已棄用),通常狀況下,您應當僅在庫模塊中使用它。 應用模塊應使用 implementation,除非您想要將其 API 公開給單獨的測試模塊。
compileOnly provided 依賴項僅在編譯時對模塊可用,而且在編譯或運行時對其消費者不可用。 此配置的行爲相似於 provided(如今已棄用)。
runtimeOnly apk 依賴項僅在運行時對模塊及其消費者可用。 此配置的行爲相似於 apk(如今已棄用)。
引子:

後來隨着項目的發展,咱們的項目慢慢遷移到了kotlin,後來又出現了以Kotlin作爲工具的類:

在這裏插入圖片描述
更新了方法、

版本號++、

upLoad、

而後。。。

在這裏插入圖片描述
在這裏插入圖片描述
原來kotlin文件生成javadoc文檔默認會報錯,查閱了相關資料,只要在gradle文件添加一些配置就行了,so:

支持上傳Kotlin代碼

  • 回到項目層級的gradle文件加上:
classpath "org.jetbrains.dokka:dokka-gradle-plugin:0.9.18"
複製代碼

那麼完整的文件就應該是這樣:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.3.10'
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'
        //upload
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
        //kotlin
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        //for kotlin upload
        classpath "org.jetbrains.dokka:dokka-gradle-plugin:0.9.18"

    }
}

allprojects {
    repositories {
        google()
        jcenter()
        
    }
}

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

複製代碼

再回到咱們tools的gradle文件,補上:

//for kotlin upload
apply plugin: 'org.jetbrains.dokka'
//同時添加三個方法 for kotlin
task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) {
    outputFormat = 'javadoc'
    outputDirectory = javadoc.destinationDir
}
task generateJavadoc(type: Jar, dependsOn: dokkaJavadoc) {
    group = 'jar'
    classifier = 'javadoc'
    from javadoc.destinationDir
}
task generateSourcesJar(type: Jar) {
    group = 'jar'
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

複製代碼

artifacts 中替換爲:

artifacts {
    archives generateJavadoc //javadocJar
    archives generateSourcesJar //sourcesJar
}

複製代碼

那麼這麼下來上傳java 又能上傳kotlin的最終模版就是:

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
//for upload
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
//for kotlin upload
apply plugin: 'org.jetbrains.dokka'

android {
    compileSdkVersion 28
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 28
        versionCode 2
        versionName "0.0.3"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    //這樣引用容易引起衝突,改成compileOnly 僅僅lib內可用
// implementation 'com.android.support:appcompat-v7:28.0.0'
    compileOnly 'com.android.support:appcompat-v7:28.0.0'
    compileOnly "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

def siteUrl = 'https://www.google.com/' //可選 若是有的話
def gitUrl = 'https://www.google.com/' //可選 若是有的話

group = "com.share"  //路徑
version = "0.0.3.release" //版本名稱, 不要用beta,不然容易審覈不經過
//以上兩個配合項目目錄名最終上傳上去引用就是 compile 'com.share:tools:0.0.2.release'

task 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))
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}
//同時添加三個方法 for kotlin
task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) {
    outputFormat = 'javadoc'
    outputDirectory = javadoc.destinationDir
}
task generateJavadoc(type: Jar, dependsOn: dokkaJavadoc) {
    group = 'jar'
    classifier = 'javadoc'
    from javadoc.destinationDir
}
task generateSourcesJar(type: Jar) {
    group = 'jar'
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

task copyDoc(type: Copy) {
    from "${buildDir}/docs/"
    into "docs"
}

//for java only
//artifacts {
// archives javadocJar
// archives sourcesJar
//}
//for kotlin
artifacts {
    archives generateJavadoc //javadocJar
    archives generateSourcesJar //sourcesJar
}


install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging 'aar'
                name 'is permission tool for android'
                url siteUrl
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id 'soulqw' //用戶名
                        name 'qinwei' //姓名
                        email 'cd5160866@126.com' //郵箱
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }
        }
    }
}

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

bintray {
    //關鍵信息咱們從localProperties文件中讀取
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")
    configurations = ['archives']
    pkg {
        repo = "TestRepository" // 倉庫名
        name = "MyTools"// 包名
        desc = 'just tools'
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}

javadoc {
    options {
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version true
        links "http://docs.oracle.com/javase/7/docs/api"
    }
}

複製代碼

再輸入上傳命令,就能夠了:

在這裏插入圖片描述

總結

基本上按照完整的以上流程,就不會有什麼上傳的問題,通常都能經過

模版以及Demo地址

最後留意下localproperties文件的配置便可

相關文章
相關標籤/搜索