Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 將Gradle項目發布到Jcenter和Maven Central

將Gradle項目發布到Jcenter和Maven Central

編輯:關於Android編程

將Gradle項目發布到Jcenter和Maven Central:為了方便我們理解Android studio是如何幫助我們獲取開源庫的,我們需要理清幾個概念。Apache Maven是Apache開發的一個工具,提供了用於貢獻library的文件服務器。總的來說,只有兩個標准的Android library文件服務器:jcenter 和 Maven Central。

jcenter

jcenter是一個由 bintray.com維護的Maven倉庫 。你可以在這裡看到整個倉庫的內容。
我們在項目的build.gradle 文件中如下定義倉庫:

allprojects {
    repositories {
        jcenter()
    }
}

Maven Central

Maven Central 則是由sonatype.org維護的Maven倉庫。
如我們使用Maven Central:

allprojects {
    repositories {
        mavenCentral()
    }
}

注:不管是jcenter還是Maven Central ,兩者都是Maven倉庫。雖然jcenter和Maven Central 都是標准的 android library倉庫,但是它們維護在完全不同的服務器上,由不同的人提供內容,兩者之間毫無關系。

其他

除了兩個標准的服務器之外,如果我們使用的library的作者是把該library放在自己的服務器上,我們還可以自己定義特有的Maven倉庫服務器。Twitter的Fabric.io 就是這種情況,它們在https://maven.fabric.io/public上維護了一個自己的Maven倉庫。如果你想使用Fabric.io的library,你必須自己如下定義倉庫的url。

repositories {
    maven { url 'https://maven.fabric.io/public' }
}

然後在裡面使用相同的方法獲取一個library。

dependencies {
    compile 'com.crashlytics.sdk.android:crashlytics:2.2.4@aar'
}

為什麼要使用兩個不同的標准倉庫

起初,Android Studio 選擇Maven Central作為默認倉庫。如果你使用老版本的Android Studio創建一個新項目,mavenCentral()會自動的定義在build.gradle中。
但是Maven Central的最大問題是對開發者不夠友好。上傳library異常困難。上傳上去的開發者都是某種程度的極客。同時還因為諸如安全方面的其他原因,Android Studio團隊決定把默認的倉庫替換成jcenter。正如你看到的,一旦使用最新版本的Android Studio創建一個項目,jcenter()自動被定義,而不是mavenCentral()。
有許多將Maven Central替換成jcenter的理由,下面是幾個主要的原因。

jcenter通過CDN發送library,開發者可以享受到更快的下載體驗。 jcenter是全世界最大的Java倉庫,因此在Maven Central
上有的,在jcenter上也極有可能有。換句話說jcenter是Maven Central的超集。 上傳library到倉庫很簡單,不需要像在 Maven Central上做很多復雜的事情 友好的用戶界面

Gradle

Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化建構工具。它使用一種基於Groovy的特定領域語言來聲明項目設置。
?很明顯,Gradle的出現是為了彌補ant和maven構建方式的不足,它不是采用傳統的xml文件構建方式,而是采用groovy方式來構建。具體映射到android中就是使用gradle腳本文件的構建方式。它貫穿了項目的整個生命周期,包括編譯、檢查、測試、打包、部署。

?因此,google將gradle方式作為了android項目管理的默認方式,使用android studio創建的項目下面會默認生成build.gradle文件作為默認構建。
更多的android Gradle介紹請看:
- gradle-android
- wikipedia-gradle介紹

常見的Maven倉庫和Gradle依賴的使用

在使用ant構建項目的時候我們要使用第三方庫往往要下載對應的庫並將其jar文件拷貝到項目文件夾下面,這樣會顯得很麻煩。在使用gradle構建方式以後我們只要需要一個坐標就能夠引入項目庫文件,例如:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
}

所謂的gradle依賴就是我們提供一個坐標然後它會自動幫我們從網絡上下載對應的文件,甚至我們可以在本地看到庫文件的源碼。
那我們到底是從哪裡下載到對應的文件呢?我們通過跟蹤項目文件頂級目錄下面的buidle gradle文件:

allprojects {
    repositories {
        jcenter()
    }
}

然後查看Jcenter的函數文件

 /**
     * Adds a repository which looks in Bintray's JCenter repository for dependencies.
     * 

* The URL used to access this repository is {@literal "https://jcenter.bintray.com/"}. * The behavior of this repository is otherwise the same as those added by {@link #maven(org.gradle.api.Action)}. *

* Examples: *

     * repositories {
     *     jcenter()
     * }
     * 
* * @return the added resolver * @see #jcenter(Action) */ MavenArtifactRepository jcenter();

最終文件指向了Maven倉庫。我們打開jcenter庫

看到了我們常見的一些庫,這樣我終於搞清楚gradle依賴是從哪裡來的了。
?事實上,這個Jcenter庫是一家叫做bintray的機構維護,它作為google android官方默認的中央庫.但在android studio的早期版本中默認使用的是maven庫,它是由sonatype機構維護的。目前主要存在的三個依賴庫為。

庫名 維護機構 android studio調用 jcenter bintray jcenter() maven sonatype mavenCentral() lvy sonatype 一般在ant中使用

上傳函數庫到Maven Central

今天我們來實踐下如何將函數庫發布到Maven Central上。

注冊bintray帳號

為了讓自己的項目也能夠被全世界的開發者使用,我們可以通過將lib項目發布到jcenter庫中,在配置腳本之前我們需要先去官網注冊一個帳號,傳送門:bintray 也可以使用第三方登錄的方式來登錄,包括github、google、facebook帳號等。注冊成功後我們先要獲取到一個api key。

上傳文件

在Jcenter庫中要求上傳到庫中的項目必須包含4個文件:

javadoc.jar sources.jar? aar或者jar pom

如果少了審核可能不會通過,當然這幾個文件都可一通過配置gradle腳本來自動生成。

配置Gradle腳本

為了創建上面所說的幾個文件,我們需要構建腳本來自動生成對應的文件。可以參考:github-SwipeView-build.gradle

配置項目依賴

在buide.gradle增加依賴:

dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
        classpath 'com.github.dcendents:android-maven-plugin:1.2'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

注意: classpath ‘com.android.tools.build:gradle:1.0.0’ 在默認生成的文件下可能版本不一致,采用默認的有時候會導致構建失敗,最好也修改成1.0.0版本的。

增加gradle插件和版本號

在需要上傳的library項目的build.gradle下增加插件引用和版本號:

apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
version = "1.0"

pom節點生成

?生成POM文件build腳本,可以參照下面的腳本:

def siteUrl = 'https://github.com/xiangzhihong/SwipeView'      // 項目的主頁
def gitUrl ='https://github.com/xiangzhihong/SwipeView.git'   // Git倉庫的url
group = "akiyama.swipe"
// 根節點添加
install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging 'aar'
                name 'swipeView 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 'akiyama'
                        name 'daliyan'
                        email '[email protected]'
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }
        }
    }
}

注意:group = “akiyama.swipe”作為項目坐標的前綴,packaging ‘aar’ 為arr包,其它的自己隨意填寫。

javadoc和sources文件的生成

添加生成任務

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
}

artifacts {
    archives javadocJar
    archives sourcesJar
}

注意:在構建生成的時候有可能會報GBK編碼等錯誤,可能需要添加UTF-8聲明,如下:

//添加UTF-8編碼否則注釋可能JAVADOC文檔可能生成不了
javadoc {
    options{
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version true
        links "http://docs.oracle.com/javase/7/docs/api"
        title "swipeJavaDoc"
    }
}

構建上傳jecnter庫中腳本

?使用前面的我們注冊帳號和apikey上傳對應的文件到jcenter庫中:
?

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")
    configurations = ['archives']
    pkg {
        repo = "maven"
        name = "swipeView"                // project name in jcenter
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}

因為用戶名和apikey是屬於個人的隱私信息,故在local.properties(該文件不會上傳到Git庫中)本地文件中配置用戶名和apikey。

sdk.dir=/home/android-sdk
bintray.user=your username
bintray.apikey=your apikey

上傳和審核

在配置好了上述build.gradle文件後我們打開gradle控制面板就能看到如圖所示的構建任務。

雙擊bintrayUpload就能自動上傳到jcenter庫中了,然後靜等審核成功。
然後成功後可以通過http://jcenter.bintray.com/ 查詢到你的庫文件。

同步項目到mvnrepository

在jcenter中提供了將項目同步到mvnrepository庫中,這樣就不需要操作上傳到mvnrepository庫的繁瑣步驟。在bintray構建腳本最後加上:

/Optional configuration for Maven Central sync of the version
            mavenCentralSync {
                sync = true //Optional (true by default). Determines whether to sync the version to Maven Central.
                user = 'userToken' //OSS user token
                password = 'paasword' //OSS user password
                close = '1' //Optional property. By default the staging repository is closed and artifacts are released to Maven Central. You can optionally turn this behaviour off (by puting 0 as value) and release the version manually.
            } 

注意:user和password即為mvnrepository中注冊的用戶名和密碼。如果同步成功你也可以通過http://mvnrepository.com/ 查詢到你上傳的lib項目。
至此使用gradle將lib庫上傳到Maven Central中央庫的介紹就完了,還不趕快試試。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved