全稱爲Apache Maven,是一個軟件(特別是Java軟件)項目管理及本身主動構建工具,由Apache軟件基金會所提供。java
在公佈maven以前,android廣泛使用ant的方式進行項目的構建和管理。它們均使用XML文件來配置描寫敘述項目的,相比較於ant maven提供的功能更增強大。android
主要表現在如下幾點:
- 使用POM的方式來管理和描寫敘述項目
- 內置了不少其它的隱式規則,使得構建文件更簡單
- 內置了軟件構建的生命週期
- 內置了依賴管理來和Repository來實現依賴管理git
然而在一些中大型項目中使用Maven方式構建軟件會讓XML配置文件愈來愈大。愈來愈笨重。而且靈活性不夠。所以,出現了gradle.github
Gradle是一個基於Apache Ant和Apache Maven概念的項目本身主動化建構工具。它使用一種基於Groovy的特定領域語言來聲明項目設置。web
很是明顯。Gradle的出現是爲了彌補ant和maven構建方式的不足。它不是採用傳統的xml文件構建方式,而是採用groovy方式來構建。詳細映射到android中就是使用gradle腳本文件的構建方式。它貫穿了項目的整個生命週期,包含編譯、檢查、測試、打包、部署。sql
所以。google將gradle方式做爲了android項目管理的默認方式,使用android studio建立的項目如下會默認生成build.gradle文件做爲默認構建。
不少其它的android Gradle介紹請看:
- gradle-android
- wikipedia-gradle介紹
- ant\maven\gradle比較apache
在使用ant構建項目的時候咱們要使用第三方庫每每要下載相應的庫並將其jar文件複製到項目文件夾如下,這樣會顯得很是麻煩。在使用gradle構建方式之後咱們僅僅要需要一個座標就可以引入項目庫文件,好比:api
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.1.1'
}
這個就是gradle依賴使用方式。所謂的gradle依賴就是咱們提供一個座標而後它會本身主動幫咱們從網絡上下載相應的文件,甚至咱們可以在本地看到庫文件的源代碼。markdown
那咱們到底是從哪裏下載到相應的文件呢?咱們經過跟蹤項目文件頂級文件夾如下的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 {@literal "https://jcenter.bintray.com/"}. * The behavior of this repository is otherwise the same as those added by {@link #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的規則來進行依賴。
aar文件其實和jar文件做用是同樣的,惟一的差異在於aar是專門針對android項目優化過的jar文件。裏面除了jar之外還包含了res\string等資源文件。
爲了讓本身的項目也可以被全世界的開發人員使用,咱們可以經過將lib項目公佈到jcenter庫中,在配置腳本以前咱們需要先去官網註冊一個賬號,傳送門:bintray 也可以使用第三方登陸的方式來登陸,包含github、google、facebook賬號等。註冊成功後咱們先要獲取到一個api key。
在Jcenter庫中要求上傳到庫中的項目必須包含4個文件:
- javadoc.jar
- sources.jar
- aar或者jar
- pom
假設少了審覈可能不會經過。固然這幾個文件均可一經過配置gradle腳原本本身主動生成。
爲了建立上面所說的幾個文件,咱們需要構建腳原本本身主動生成相應的文件。
詳細可以參考:github-SwipeView-build.gradle
將項目文件根文件夾(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版本號的。
在需要上傳的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
生成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 'dali_yan@yeah.net'
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
注意:group = 「akiyama.swipe」做爲項目座標的前綴。packaging ‘aar’ 爲arr包,其它的本身任意填寫。
加入生成任務:
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"
}
}
使用前面的咱們註冊賬號和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庫中了。
到官網找到咱們剛剛上傳的文件。提交審覈便可了(別跟我說你找不到),通常2-3個小時就能審覈成功。
成功後可以經過http://jcenter.bintray.com/ 查詢到你的庫文件,好比個人項目文件路徑爲:http://jcenter.bintray.com/akiyama/swipe/library/2.1
在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項目
在構建腳本過程當中可能會出現一些問題:
- 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'
本文學習了gradle的一些基本知識和主要的構建,學習了怎樣將lib庫上傳到中央倉庫中,以及在這個過程當中可能遇到的問題。