Library Module上傳Jcenter詳解

mymdeep發表於2017-03-30

將Library Module上傳Jcenter的文章,網上一搜一大堆,主要分為兩類,一類是正常的流程,使用gradle上傳到Jcenter,還有一種較為簡便,是將上傳的方法封裝成一個gradle外掛,你直接依賴,設定,呼叫方法即可。在寫這篇文章之前,我特意將兩種方法都做了測試,我個人還是感覺用原生的方法較好,一是能瞭解上傳流程,其次,遇到坑了也知道該怎麼找問題。

在開始之前,需要說明由於上傳依賴的都是gradle,希望開發者能有一些基本的gradle語法常識,所以這裡推薦我之前寫的兩篇文章:
Android工程gradle詳解
Groovy基礎


賬號註冊

首先肯定是需要去官網註冊一個賬號:

Library Module上傳Jcenter詳解

這一步就不多說了

準備

賬號有了,你要想上傳Module,至少你要有一個Module,你可以新建,也可以使用現有已經寫好的。但是要注意,要上傳的Module,必須要是Library Module,有人可能問,這有啥區別?
區別在這裡:

   defaultConfig {
        minSdkVersion 9
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }複製程式碼

Library Module沒有applicationId,App Module有applicationId,也就是你的包名。

根目錄中的配置:

注意這裡說的是根目錄,也就是Project的build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'//2.1.2對應1.3
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6'
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.0.0" //

    }
}複製程式碼

需要注意如果用的2.1.2的gradle使用的上傳外掛是1.3,如果別的版本,可能需要修改版本,否則編譯會報錯。

正常來說,根目錄的配置就完成了。如果你的Project下的Module有多個要上傳,建議將配置的基本資料放在這裡:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'//2.1.2對應1.3
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6'
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.0.0" //

    }
}

allprojects {
    repositories {
        jcenter()
    }
}
ext {
    siteUrl = 'https://github.com/xxx/xxxx'
    gitUrl = 'https://github.com/xxxx/xxxx.git'
    group = "com.xxx.xxxx"
    version = "1.4"
    id = 'xxx'
    name = 'xxx'
    email =  xxxx@vip.qq.com'
    packaging = 'aar'

}
task clean(type: Delete) {
    delete rootProject.buildDir
}複製程式碼

看到上面程式碼中ext部分就是需要自己根據自己工程資訊填寫的部分。
好了,這裡的配置就完成了

使用者名稱和API KEY

這兩個資訊我們需要寫在local.properties中,當然,你可能會問為什麼非要寫在這個檔案中,不能寫在剛才的ext中嗎?
可以,但是這兩個資訊涉及保密的東西,一般不對外,你將程式碼上傳到github上,build.gradle檔案是暴露的,但是local.properties是不暴露的。
首先需要先登入到Jcenter官網->Edit Profile->API Key:

Library Module上傳Jcenter詳解

然後開啟local.properties放入,這個檔案裡面應該還有你的android sdk或ndk的路徑配置:

sdk.dir=/Users/xxxx/Library/Android/sdk
BINTRAY_USER=xxxx
BINTRAY_KEY=xxxxxxx複製程式碼

上傳

接下來就是重頭戲了,上傳的程式碼。這些程式碼需要寫在你要上傳的Module的build.gradle中,你可以就寫在dependencies的底下。
首先需要引入兩個外掛(為了讓看官們,理解應該寫在哪,我在上面加入了dependencies部分,這個與上傳無關):

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

}
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'複製程式碼

接下來是定義寫基本資訊:

apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'

def libname = 'sina_full'//專案的名字 這個與之後生成的路徑無關,單純是在網站上的顯示
def libdesc = '新浪完整版' //專案的名字 這個與之後生成的路徑無關,單純是在網站上的顯示
version = rootProject.ext.version//版本號,這個我們寫在ext中了,沒看到的朋友,往前看
group = rootProject.ext.group//這個就是路徑名的group了複製程式碼

這裡要特別注意group就是上傳成功之後,依賴的group,具體可以參照下圖:

Library Module上傳Jcenter詳解

然後就是聲稱對應的jar和javadoc(以下程式碼可以直接拷貝,前提是在Project的gradle中配置了ext):

//生成原始檔
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))
    options.encoding "UTF-8"
    options.charSet 'UTF-8'
    options.author true
    options.version true
    failOnError false
}

//文件打包成jar
task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}
//拷貝javadoc檔案
task copyDoc(type: Copy) {
    from "${buildDir}/docs/"
    into "docs"
}

//上傳到jcenter所需要的原始碼檔案
artifacts {
    archives javadocJar
    archives sourcesJar
}

// 配置maven庫,生成POM.xml檔案
install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging rootProject.ext.packaging
                name libname
                url siteUrl
                licenses {
                    license {
                        name libname
                        url rootProject.ext.siteUrl
                    }
                }
                developers {
                    developer {
                        id rootProject.ext.id
                        name rootProject.ext.name
                        email rootProject.ext.email
                    }
                }
                scm {
                    connection rootProject.ext.gitUrl
                    developerConnection rootProject.ext.gitUrl
                    url rootProject.ext.siteUrl
                }
            }
        }
    }
}複製程式碼

以上程式碼就是生成上傳所需要的東西,接著就是上傳了:

Properties properties = new Properties()//先要讀取local.properties中的name和key
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
    user = properties.getProperty("BINTRAY_USER")    //讀取 local.properties 檔案裡面的 bintray.user
    key = properties.getProperty("BINTRAY_KEY")   //讀取 local.properties 檔案裡面的 bintray.apikey
    configurations = ['archives']
    pkg {
        repo = "maven"
        name = libname    //釋出到JCenter上的專案名字,必須填寫
        desc = libdesc    //專案描述
        websiteUrl = rootProject.ext.siteUrl
        vcsUrl = rootProject.ext.gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}複製程式碼

至此,一切配置都完成了,可以執行了。

執行

執行分成兩步:

  • 生成POM檔案
    Windows:gradlew install
    Mac:gradle install
  • 上傳你的Library庫到jcenter的maven庫
    Windows:gradlew bintrayUpload
    Mac:gradle bintrayUpload

    上傳完成

    上傳完成之後並不能真的使用。
    登入jcenter首頁->點選下方maven即可進入到你上傳的maven庫列表介面

Library Module上傳Jcenter詳解

在maven庫列表介面找你你剛才上傳的maven庫點進去即可看到相關的專案詳情:

Library Module上傳Jcenter詳解

點開你上傳的專案,找到Add to JCenter 按鈕,點選:

Library Module上傳Jcenter詳解

然後會跳轉到提交描述內容介面:

Library Module上傳Jcenter詳解

點選提交即可。
一般沒有問題的話,第二天即可使用。

上傳遇到的坑

在這裡,我會總結一下上傳的時候可能遇到的坑,以下內容不一定是我遇到的,有部分摘自網路,方便大家檢視:

  • 編碼GBK的不可對映字元
    解決:
    task javadoc(type: Javadoc) {
            options.encoding "UTF-8"
            options.charSet 'UTF-8'
        }複製程式碼
  • gradle 許可權不足,或找不到gradle
    解決:先source一下,或者檢查環境變數
  • Lint found errors in the project; aborting build.
    解決:第一,根據提示修改程式碼中不規範的地方,第二,去掉lint
    android {
    lintOptions {
    abortOnError false
    }
    }複製程式碼
  • Javadoc generation failed. Generated Javadoc options file
    解決:第一,正常加入javadoc生成,第二,去掉javadoc檢查:
    allprojects {
    repositories {
    jcenter()
    }
    tasks.withType(Javadoc) {
    options.addStringOption('Xdoclint:none', '-quiet')
    options.addStringOption('encoding', 'UTF-8')
    }
    }複製程式碼
  • Could not create version ‘0.1’: HTTP/1.1 401 Unauthorized [message:This resource requires authentication]
    解決:沒有配置正確的API Key
  • 如何升級
    解決:如果你是跟著我的教程走的,只需要修改ext中的version版本號即可。

最後還是推薦一下我的公眾號,歡迎給我留言。
更多的開發知識,可以關注我的公眾號:

Library Module上傳Jcenter詳解

相關文章