在AndroidStudio中,使用Gradle打包aar到JCenter倉庫!完整版教程!填補各種坑
環境
AndroidStudio 1.2.1.1正式版
本教程以我的一個測試倉庫作為DEMO,名為JCenterDemo。本教程只涉及如何打包aar至JCenter倉庫,如何使用git不在本教程涉及之內,所以本文只是單單在Github建立了一個同名倉庫而已,不過可以推薦一個入門git教程GitBook
本教程解決javadoc亂碼問題,包含第三方依賴的javadoc打包失敗問題以及install任務生成pom檔案失敗問題。
二.註冊bintray賬號
在https://bintray.com/上註冊一個賬號。並記錄下你的UserId和API
Key,UserId即為你的登陸ID,API Key相當與一種授權,方便你可以不用填入密碼就可以上傳檔案至倉庫。
三.建立你的工程,如我建立的工程為下圖
一般來說上傳至公共倉庫的均為Library,所以本例也以一個Lib作為示例。並新建一個Module名為JCenterLib的Lib。
此時工程目錄結構為
四.完成你個人的庫
如本文新建了兩個Handler的工具類,分別適用於Activity和Fragment。
如這是該示例庫中的適用於Fragment的Handler工具類
package com.cqu.jcenterlib; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import java.lang.ref.SoftReference; /** * Created by A Shuai on 2015/5/2. * 適用於Fragment的Handler的抽象模板類 */ public abstract class AbsFragmentHandler<T extends Fragment> extends Handler { private final SoftReference<T> mFragmentRef; public AbsFragmentHandler(T mFragment) { mFragmentRef = new SoftReference<T>(mFragment); } /** * 不許覆寫,若對需對訊息處理可對{@link #handleMessage(Fragment, Message, Bundle)}進行覆寫 * * @param msg Message訊息物件 */ @Override public final void handleMessage(Message msg) { T mFragment = mFragmentRef.get(); if (mFragment == null) { return; } handleMessage(mFragment, msg, msg.getData()); } /** * 主要的訊息處理邏輯 * * @param mFragment 型別引數T所指定的Fragment物件 * @param msg Message訊息物件 * @param mBundle 可以為null */ protected abstract void handleMessage(T mFragment, Message msg, Bundle mBundle); }
五.在當前工程中的app的這個Module中引用該lib,
在app這個Module的build.gradle檔案中加入一項依賴,即可在app這個Module中使用JCenterLib中定義的工具類了。
complile project(':JCenterLib')
六.開啟專案根目錄中的build.gradle 新增 buildscript 的 reposiories
classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
編輯前:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
編輯後:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
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
}
}
allprojects {
repositories {
jcenter()
}
}
七.在JCenterLib這個Module中新建一個檔案,名為bintray.gradle
內容為:
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
group = PROJ_GROUP
version = PROJ_VERSION
project.archivesBaseName = PROJ_ARTIFACTID
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
}
javadoc {
options{
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "http://docs.oracle.com/javase/7/docs/api"
}
}
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom.artifactId = PROJ_ARTIFACTID
pom {
project {
description PROJ_DESCRIPTION
packaging 'aar'
name PROJ_NAME
url PROJ_WEBSITEURL
licenses {
license {
name LICENSE_NAME
url LICENSE_URL
}
}
developers {
developer {
id DEVELOPER_ID
name DEVELOPER_NAME
email DEVELOPER_EMAIL
}
}
scm {
connection PROJ_VCSURL
developerConnection PROJ_VCSURL
url PROJ_WEBSITEURL
}
}
}
}
}
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
user = properties.getProperty("bintray.user")
key = properties.getProperty("bintray.apikey")
configurations = ['published','archives']
publish = true
pkg {
repo = "maven"
name = PROJ_NAME
desc = PROJ_DESCRIPTION
websiteUrl = PROJ_WEBSITEURL
issueTrackerUrl = PROJ_ISSUETRACKERURL
vcsUrl = PROJ_VCSURL
licenses = ["Apache-2.0"]
publicDownloadNumbers = true
}
}
*注:此檔案中規定了生成javadoc的編碼格式為utf-8,所以大家在使用各種IDE時為了避免各種亂碼問題,應在設定中將工作空間的編碼設定為統一採用utf-8編碼.
八.同樣在JCenterLib這個Module下新建一個名為gradle.properties的檔案
內容為:
PROJ_GROUP=com.github.ls1110924.library
PROJ_VERSION=1.0.0
PROJ_NAME=JCenterLib
PROJ_WEBSITEURL=https://github.com/ls1110924/JCenterDemo
PROJ_ISSUETRACKERURL=https://github.com/ls1110924/JCenterDemo/issues
PROJ_VCSURL=https://github.com/ls1110924/JCenterDemo.git
PROJ_DESCRIPTION=A Test Lib
PROJ_ARTIFACTID=JCenterLib
LICENSE_NAME='The Apache Software License, Version 2.0'
LICENSE_URL='http://www.apache.org/licenses/LICENSE-2.0.txt'
DEVELOPER_ID=ls1110924
DEVELOPER_NAME=A Shuai
[email protected]
我先依次解釋一下每個條目的意義
PROJ_GROUP 為你上傳的構件的Group,如compile 'com.android.support:appcompat-v7:22.2.0'中的com.android.support
PROJ_VERSION 為你此次上傳構件的版本號,如compile 'com.android.support:appcompat-v7:22.2.0'中的22.2.0,以後更新構件重新上傳的時候只需要修改這裡就好。
PROJ_NAME 為上傳到你bintray的maven倉庫的倉庫名,即他會在你的maven倉庫中新建一個子倉庫,並使用這個值作為倉庫名。
PROJ_WEBSITEURL 為你的工程網站的url,一般為你的Github專案地址,如https://github.com/ls1110924/LightUtils
PROJ_ISSUETRACKERURL 為你的工程issue的url,一般為https://github.com/ls1110924/LightUtils/issues
PROJ_VCSURL 為你的專案版本控制系統的url,一般為https://github.com/ls1110924/LightUtils.git,切不可忘記最後面的.git
PROJ_DESCRIPTION 為你的專案描述,大家隨意填寫
PROJ_ARTIFACTID 為你的構件ID,如如compile 'com.android.support:appcompat-v7:22.2.0'中的appcompat-v7
LICENSE_NAME和LICENSE_URL保持不變即可
DEVELOPER_ID為開發者ID,大家隨意填寫
DEVELOPER_NAME為開發者姓名,隨意填寫
DEVELOPER_EMAIL為開發者郵箱,最後填寫正確的郵箱,什麼郵箱都可以
*注意:這裡最好把構件ID的命名和你要打包上傳的Module同名,如若不喜歡Module名作為構件ID,下面教大家動態修改Module名,這裡必須同名是因為一會的上傳任務是預設使用Module名作為構件ID的,這裡宣告的構件名就沒有了效果。
這時咱們上傳的構件依賴就為 complile 'com.github.ls1110924.library:JCenterLib:1.0.0'
*這裡因為gradle.properties檔案是咱們個人的一些私人資訊配置,一般不會同步到Github的遠端倉庫上,這裡需要在JCenterLib這個Moduel的.gitignore檔案配置忽略上傳gradle.properties這個檔案
/gradle.properties
九.有心的旁友可能已經注意到第七步中的user和key還沒有配置
其實這兩個值就是我們第二步中申請bintray的UserID和分配的APIKey
開啟專案根目錄下的local.properties檔案,這個檔案專案預設提供了忽略,所以可以把一些非常私人的資料放在這裡
bintray.user=ls1110924
bintray.apikey=xxxxxxxxxxxxxxxxxxxxx
十.Module改名
如果一些人不喜歡使用Module名作為PROJ_ARTIFACTID構件ID的使用者可以看這一步,無所謂的朋友可以跳過這一步
開啟專案根目錄的settings.gradle檔案,加一句
def submoduleProject = project(':JCenterLib')
submoduleProject.name = 'jcenter'
JCenterLib為我們原始的Module名,現在動態改為jcenter,修改後的setting.gradle檔案內容為
include ':app', ':JCenterLib'
def submoduleProject = project(':JCenterLib')
submoduleProject.name = 'jcenter'
這是這個Module雖然目錄還為JCenterLib,但是它實際的名字已經變成了jcenter,所以這時候app這個Module繼續引用JCenterLib就會報錯,所以應修改為app這個Module
下的build.gradle檔案中的依賴,
從
complile project(':JCenterLib')
修改為
compile project(':jcenter')
同時修改JCenterLib這個Module中gradle.properties中的
PROJ_ARTIFACTID=jcenter
此時gradle.properties檔案內容為:
PROJ_GROUP=com.github.ls1110924.library
PROJ_VERSION=1.0.0
PROJ_NAME=JCenterLib
PROJ_WEBSITEURL=https://github.com/ls1110924/JCenterDemo
PROJ_ISSUETRACKERURL=https://github.com/ls1110924/JCenterDemo/issues
PROJ_VCSURL=https://github.com/ls1110924/JCenterDemo.git
PROJ_DESCRIPTION=A Test Lib
PROJ_ARTIFACTID=jcenter
LICENSE_NAME='The Apache Software License, Version 2.0'
LICENSE_URL='http://www.apache.org/licenses/LICENSE-2.0.txt'
DEVELOPER_ID=ls1110924
DEVELOPER_NAME=A Shuai
[email protected]
那麼此時使用此構建的依賴就變為 complile 'com.github.ls1110924.library:jcenter:1.0.0'
十一.在JCenterLib這個Module中的build.gradle檔案末尾加一句
apply from: 'bintray.gradle'
此時該檔案內容為
apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "22.0.1"
defaultConfig {
minSdkVersion 8
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
}
apply from: 'bintray.gradle'
這時基本完成了所有的編寫工作,接下來開始打包各種jar檔案並上傳即可
*此時應進行一次Sync同步操作,因為修改了build.gradle檔案,還可以為預防沒有生成響應的打包任務。
十二.執行生成sources.jar任務
展開JCenterDemo - :jcenter - Tasks - other
執行其中的sourcesJar任務,一般這個任務不會出錯,都會在JCenterLib/build/libs下生成原始碼的jar包,名字為 ModuleName-版本號-sources.jar,如jcenter-1.0.0-sources.jar。
十三,生成javadoc檔案
同樣執行other中的javadoc任務,如果你的專案中使用了第三方依賴或libs檔案中第三方jar包,這個任務有可能會出錯,出錯異常為程式包不存在或者找不到符號等。
但是不用擔心,其實這個任務已經算是執行完畢了,他在JCenterLib/build下生成了一個docs的資料夾,並把生成好的html檔案放在其中
十四.執行打包生成javadoc.jar檔案
執行同樣位於other下的javadocJar任務,如果沒有出錯,會在JCenterLib/build/libs下生成對應的javadoc.jar檔案,但是如果出錯,則需要我們手動打包javadoc.jar檔案
(1)複製我上傳的附件中的META-INF資料夾到JCenterLib/build/docs/javadoc/檔案內,如圖
開啟此壓縮包看到的效果應如圖:
(3)複製此zip包到JCenterLib/build/libs目錄下,並改名為 ModuleName-版本號-javadoc,並將檔案字尾名從zip修改為jar
十五.生成pom檔案
執行同為other下的install任務,如果任務成功會在JCenterLib/build/下生成poms資料夾以及其中的pom-default.xml檔案
(1)如果任務失敗,則需我們手動配置此檔案,同樣複製我上傳的附件中的poms資料夾至JCenterLib/build/下
(2)使用任意一款編輯器修改poms資料夾下的pom-default.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.github.ls1110924.library</groupId>
<artifactId>jcenter</artifactId>
<version>1.0.0</version>
<packaging>aar</packaging>
<name>JCenterLib</name>
<description>A Test Lib</description>
<url>https://github.com/ls1110924/JCenterDemo</url>
<licenses>
<license>
<name>'The Apache Software License, Version 2.0'</name>
<url>'http://www.apache.org/licenses/LICENSE-2.0.txt'</url>
</license>
</licenses>
<developers>
<developer>
<id>ls1110924</id>
<name>A Shuai</name>
<email>[email protected]</email>
</developer>
</developers>
<scm>
<connection>https://github.com/ls1110924/JCenterDemo.git</connection>
<developerConnection>https://github.com/ls1110924/JCenterDemo.git</developerConnection>
<url>https://github.com/ls1110924/JCenterDemo</url>
</scm>
<dependencies>
<dependency>
<groupId>com.android.support</groupId>
<artifactId>appcompat-v7</artifactId>
<version>22.2.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
groupId 對應 PROJ_GROUP
artifactId 對應 PROJ_ARTIFACTID
version 對應 PROJ_VERSION
name 對應 PROJ_NAME
description 對應 PROJ_DESCRIPTION
url 對應 PROJ_WEBSITEURL
developer-id 對應 DEVELOPER_ID
developer-name 對應 DEVELOPER_NAME
developer-email 對應 DEVELOPER_EMAIL
connection 對應 PROJ_VCSURL
developerConnection 對應 PROJ_VCSURL
url 對應 PROJ_WEBSITEURL
dependencies標籤代表了你的這個庫所使用的依賴,但僅限build.gradle中宣告的依賴,libs資料夾中的jar包不算
個人可根據個人情況自行增刪,但dependency-scope標籤應保持compile不變
十六.最後一步,執行bintrayUpload任務即可
十七.登陸bintray網站,進行最後一次檢查。
首先開啟自己的maven倉庫,找到剛剛上傳的倉庫並開啟;然後切換到Files的Tab頁。
(1)此時應該看到一個以版本命名的資料夾和一個名為maven-metadata.xml的檔案,並把maven-metadata.xml檔案下載下來(點選maven-metadata.xml即可下載),maven-metadata.xml檔案的內容應為:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>com.github.ls1110924.library</groupId>
<artifactId>jcenter</artifactId>
<version>1.0.0</version>
<versioning>
<latest>1.0.0</latest>
<release>1.0.0</release>
<versions>
<version>1.0.0</version>
</versions>
<lastUpdated>20150612080145</lastUpdated>
</versioning>
</metadata>
此時檢查groupId,artifactId和version三個標籤是否同你設定的一致,重點檢查artifactId這個標籤,這個標籤一般和ModuleName一致,如果你動態修改了ModuleName,則檢查當前的值是否和你動態修改後的值一致,如果不一致,則清理工程,重新構建並執行任務和上傳。
(2)檢查版本號資料夾下的內容。
正常情況下,應該有四個檔案,分別為javadoc.jar,sources.jar,aar和pom檔案,如果不對則應是三個打包任務沒有執行重新(aar打包任務不需干預),則需全部執行完畢再上傳即可
*注:如果重新上傳,則應該把當前存在的所有檔案刪除再上傳,否則會出現衝突。
十八.將當前倉庫關聯到jcenter倉庫以便AndroidStudio能夠方便的進行依賴。
首先切換到General這個Tab頁,然後點選右下方的 Add to JCenter按鈕
在1處隨便填一些你的lib的介紹即可,然後點選send按鈕即可
如果管理員稽核通過後會在3箭頭所指之處進行通知
十九.最後我們就可以在我們的專案以外方便的引入這個庫了
引入的程式碼為
compile 'com.github.ls1110924.library:jcenter:1.0.0'
附件:下載地址