1. 程式人生 > >Android Library釋出到Maven倉庫以及使用

Android Library釋出到Maven倉庫以及使用

如同以往的部落格一樣,先來說說為什麼要寫這篇部落格吧。昨天做了一個android類庫,由於有資原始檔,所以打包成了aar,於是順利將其整合到其它專案中,看起來沒問題可以用,但是除錯時候發現類庫dependency中compile的第三方包沒有正確的打包進來。這就悲催了,總不能在新的專案中將類庫中需要的包compile進來啥,這不久太low了麼,於是絞盡腦汁想解決辦法,在網上找到不少資料說將類庫釋出到本地Maven倉庫可以解決這個問題,嘗試了下,的確可以解決(如果類庫依賴了其它本地類庫或者jar包則超出本部落格的討論範圍,請看fat-aar相關資料)。

這篇文章的目的就是總結將Android類庫釋出到Maven倉庫的實現方法,這裡的Maven倉庫有兩種一種是本地的,一種是遠端的(以Git為例)。

1、釋出類庫到本地Maven倉庫

首先建立一個Android專案,然後建立一個我們需要的Android Library
這裡寫圖片描述

這裡建立一個名為androidLib的類庫,在androidLib中新增對應的dependency依賴,這裡添加個Gson和OkHttp3的依賴

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support'
, module: 'support-annotations' }) compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' compile 'com.google.code.gson:gson:2.8.2' compile 'com.android.support:appcompat-v7:26.+' testCompile 'junit:junit:4.12' }

同時建立一個HelpUtil的輔助類(這個無所謂,主要是方便測試)

我們知道pom依賴是由三部分組成的比如下面的okhttp3的依賴,主要就是需要groupId、artifactId以及version。

<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>logging-interceptor</artifactId>
  <version>3.4.1</version>
  <scope>compile</scope>
</dependency>

那麼我們在將類庫釋出到Maven倉庫就需要配置這三個資訊,同時還需要配置倉庫的位置,於是就有了下面三個關鍵步驟。

a、androidLib模組中新建gradle.properties檔案,新增以下內容

#包資訊
ARTIFACTID = androidLib
LIBRARY_VERSION = 1.0.0

#Mac下地址: file:///Users/<username>/my/local/repo
#Windows下地址: file:///<碟符>:/users/<username>/my/local/repo
LOCAL_REPO_URL=file:///C:/Users/caicai/my/local/repo

這裡設定好artifactId、version以及倉庫位置對應的幾個變數資訊。

b、專案根目錄下的gradle.properties(沒有則新建一個)中新增如下內容

#包資訊
GROUP_ID = com.yoryky.mavendemo

# Licence資訊
PROJ_LICENCE_NAME=The Apache Software License, Version 2.0
PROJ_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
PROJ_LICENCE_DEST=repo

這裡設定好groupId對應的變數資訊。

c、開始配置groupId、artifactId、version以及倉庫位置

在androidLib對應的build.gradle中新增如下內容

apply plugin: 'maven'

uploadArchives{
    repositories.mavenDeployer{
        repository(url:LOCAL_REPO_URL)
        pom.groupId = GROUP_ID
        pom.artifactId = ARTIFACTID
        pom.version = LIBRARY_VERSION
    }
}

實際上a和b都是在配置變數,正真的設定就是c這個地方,也可以直接跳過a、b步驟,直接在c這裡賦值就行了。

關於釋出的配置配置就算結束,同步下gradle,然後可以看到gradle工具中有如下uploadArchives命令

這裡寫圖片描述

雙擊觸發該命令,然後到我們設定的對應repo中可以發現,釋出成功。

這裡寫圖片描述

這裡可以看到生成了一個pom檔案以及對應的androidLIb.aar包,再來看看pom檔案內容

<?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.yoryky.mavendemo</groupId>
  <artifactId>androidLib</artifactId>
  <version>1.0.0</version>
  <packaging>aar</packaging>
  <dependencies>
    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>logging-interceptor</artifactId>
      <version>3.4.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.2</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.android.support</groupId>
      <artifactId>appcompat-v7</artifactId>
      <version>26.+</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

發現我們需要的okhttp3和gson都在裡面了,那麼在其它專案中compile這個maven倉庫中的androidLib就會根據這個pom檔案找到androidLib包的依賴並將其自動新增到專案中。

2、使用本地倉庫中的類庫

第一小節講了如何將類庫釋出到本地倉庫,那麼這一小節來說說使用的問題。既然都發布成功了使用就很簡單了。

首先,在Project的build.gradle中新增對本地Maven倉庫的引用

allprojects {
    repositories {
        jcenter()
        maven{
            url 'file:///C:/Users/caicai/my/local/repo/'
        }
    }
}

這裡的url就對應我們上面設定的倉庫路徑。

然後在對應模組中新增對androidLib的依賴既可

這裡寫圖片描述

這裡冒號分割的三個部分,就分別對應上面設定的groupId、artifactId以及version。

再看在專案中的使用

這裡寫圖片描述

這確認了,androidLib依賴包被成功新增到了專案中。

3、說說遠端Maven倉庫

第一、二小節說了類庫釋出到本地Maven倉庫以及使用,那麼可以釋出到遠端Maven倉庫麼,答案是當然可以啊,這裡就以github來說明吧。

先到github上建立一個new repository命名我MavenDemo,獲取其git地址,然後將專案拉取到本地(名字也是MavenDemo),將repo下對應的類庫拷貝到MavenDemo目錄下,然後push到github。

本地的MavenDemo目錄如下

這裡寫圖片描述

提交到github後如下

這裡寫圖片描述

那麼遠端Maven倉庫就算是配置完成了(啥?這麼簡單)。

然後來看看使用吧

同樣的我們需要在Project對應的build.gradle檔案中去配置maven的url地址

賦值github專案路徑

https://github.com/Yoryky/MavenDemo

將其變換為

https://raw.githubusercontent.com/Yoryky/MavenDemo/master

這其中將gitub.com變成了raw.githubusercontent.com然後在路徑末尾添加了master。

這個raw.githubusercontent.com域名是github的素材庫,我估計上傳的maven倉庫被放到這個域名下面,至於為什麼不能直接用github專案路徑作為地址,我也感到納悶,有高手望指出。

有了路徑後,還是配置好

allprojects {
    repositories {
        jcenter()
        maven{
            //遠端maven路徑
            url 'https://raw.githubusercontent.com/Yoryky/MavenDemo/master'
        }
    }
}

然後通過同樣的方法compile依賴androidLib,測試後發現依賴成功。

到這裡也就算是說清楚了Android類庫釋出及使用maven倉庫的過程,這裡給出一個測試Demo吧,MavenDemo

4、參考文獻