1. 程式人生 > >將Gradle項目公布到maven倉庫

將Gradle項目公布到maven倉庫

檢查 一個 comment content 註意 靈活性 gen android-m 詳細

將Gradle項目公布到maven倉庫

1 Gradle簡單介紹

1.1 Ant、Maven還是Gradle?

1.1.1 Ant和Maven介紹

全稱為Apache Maven,是一個軟件(特別是Java軟件)項目管理及自己主動構建工具,由Apache軟件基金會所提供。

?在公布maven之前,android普遍使用ant的方式進行項目的構建和管理。它們均使用XML文件來配置描寫敘述項目的,相比較於ant maven提供的功能更加強大。

主要表如今以下幾點:
- 使用POM的方式來管理和描寫敘述項目
- 內置了很多其它的隱式規則,使得構建文件更簡單
- 內置了軟件構建的生命周期
- 內置了依賴管理來和Repository來實現依賴管理

?然而在一些中大型項目中使用Maven方式構建軟件會讓XML配置文件越來越大。越來越笨重。並且靈活性不夠。因此,出現了gradle.

1.1.2 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介紹
- ant\maven\gradle比較

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

?在使用ant構建項目的時候我們要使用第三方庫往往要下載相應的庫並將其jar文件復制到項目文件夾以下,這樣會顯得非常麻煩。在使用gradle構建方式以後我們僅僅要須要一個坐標就能夠引入項目庫文件,比如:

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

?這個就是gradle依賴使用方式。所謂的gradle依賴就是我們提供一個坐標然後它會自己主動幫我們從網絡上下載相應的文件,甚至我們能夠在本地看到庫文件的源代碼。


那我們究竟是從哪裏下載到相應的文件呢?我們通過跟蹤項目文件頂級文件夾以下的buidle gradle文件:

allprojects {
    repositories {
        jcenter()
    }
}

jcenter函數:

   /**
     * Adds a repository which looks in Bintray‘s JCenter repository for dependencies.
     * <p>
     * The URL used to access this repository is [email protected] "https://jcenter.bintray.com/"}.
     * The behavior of this repository is otherwise the same as those added by [email protected] #maven(org.gradle.api.Action)}.
     * <p>
     * Examples:
     * <pre autoTested="">
     * repositories {
     *     jcenter()
     * }
     * </pre>
     *
     * @return the added resolver
     * @see #jcenter(Action)
     */
    MavenArtifactRepository jcenter();

?我們知道我們的包是從一個叫做Bintray’s JCenter repository中下載而來的,我們打開jcenter庫試試,
技術分享

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

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

三者都是基於Apache Maven的規則來進行依賴。

1.3 aar庫文件

?aar文件其實和jar文件作用是一樣的,唯一的差別在於aar是專門針對android項目優化過的jar文件。裏面除了jar以外還包含了res\string等資源文件。

2 將項目公布到Jcenter Maven倉庫中

2.1 公布Jcenter步驟

2.1.1 註冊bintray帳號

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


技術分享

2.1.2 上傳文件

?在Jcenter庫中要求上傳到庫中的項目必須包含4個文件:
??- javadoc.jar
??- sources.jar
??- aar或者jar
??- pom
?假設少了審核可能不會通過。當然這幾個文件都可一通過配置gradle腳本來自己主動生成。

2.2 配置Gradle腳本

?為了創建上面所說的幾個文件,我們須要構建腳本來自己主動生成相應的文件。

詳細能夠參考:github-SwipeView-build.gradle

2.2.1 配置項目依賴

將項目文件根文件夾(Top-level)以下的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版本號的。

2.2.2 添加gradle插件和版本號號

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

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

註意:版本號號作為項目坐標的一部分。以後在升級項目的時候都須要升級版本號號,否則會覆蓋掉已經上傳的版本號.
?關於插件bintray的更詳細的使用方式能夠查看:github-bintray

2.2.3 pom節點生成

?生成POM文件build腳本

def siteUrl = ‘https://github.com/daliyan/SwipeView‘      // 項目的主頁
def gitUrl = ‘https://github.com/daliyan/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包,其它的自己任意填寫。

2.2.4 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"
    }
}
2.2.5 構建上傳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

2.3 上傳和審核

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

技術分享

我們僅僅須要雙擊bintrayUpload就能自己主動上傳到jcenter庫中了。
到官網找到我們剛剛上傳的文件。提交審核即可了(別跟我說你找不到),一般2-3個小時就能審核成功。
成功後能夠通過http://jcenter.bintray.com/ 查詢到你的庫文件,比如我的項目文件路徑為:http://jcenter.bintray.com/akiyama/swipe/library/2.1

2.4 同步項目到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中註冊的username與password。

假設同步成功你也能夠通過http://mvnrepository.com/ 查詢到你上傳的lib項目

2.5 常見問題

在構建腳本過程中可能會出現一些問題:
- GBK編碼問題。前文已經提供了解決方式;
- 依賴庫問題,可能會報告一些警告。僅僅要保證最後構建成功,直接忽略即可;
- gradle依賴問題:能夠參照githug-bintray 解決方式:
Gradle >= 2.1

plugins {
    id "com.jfrog.bintray" version "1.3.1"
}

Gradle < 2.1

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath ‘com.jfrog.bintray.gradle:gradle-bintray-plugin:1.3.1‘
    }
}
apply plugin: ‘com.jfrog.bintray‘

3 小結

本文學習了gradle的一些基本知識和主要的構建,學習了怎樣將lib庫上傳到中央倉庫中,以及在這個過程中可能遇到的問題。

將Gradle項目公布到maven倉庫