AndroidStudio加速之--(四)發佈aar到Artifactory幷包含其他依賴

一、前言

經過前面一些列的開發,我們已經將aar發佈到Artifactory倉庫了。但是有些情況下,我們開發的aar還會包含其他的依賴的,比如說我們開發一個json轉換的工具類,需要依賴google的gson。 然後你在module的gradle中添加了依賴 ,如下:

api 'com.google.code.gson:gson:2.8.5'

當你參考之前的教程進行打包的時候,你會發現打出來的aar中不會包含任何gson的相關代碼,此時別人也直接使用你的aar的話可能就會造成崩潰。那麼這種情況下我們要怎麼處理呢?

二、解決辦法

目前我們有兩種辦法可以解決上述問題,如下:

2.1、讓其他人員自行添加gson依賴

這種就是最基本的方式了,可以在說明文檔中告知使用者需要添加gson依賴。這裏不再做過多解釋。

2.2、將gson依賴添加到pom文件

從前面的文章中我們可以發現,上傳aar之前會先生成pom文件,然後會將pom文件和aar一起上傳到構件倉庫。
生成的pom文件位置在:$buildDir/publications/(你自己定的名字,例如我這裏是:aar_pub)/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.cooloongwu.hello</groupId>
  <artifactId>hello.native</artifactId>
  <version>0.0.1</version>
  <packaging>aar</packaging>
</project>

當我們依賴這個構件的時候,gradle會檢查pom文件,然後下載相應的依賴。所以如果我們在這個文件中處理下,聲明下我們需要gson的依賴可以麼,答案是可以的!maven有這個DSL的語法,直接看下面的pom.withXml節點即可:

publishing {
    publications {
        aar_pub(MavenPublication) {
            groupId = GROUP_ID
            artifactId = ARTIFACT_ID
            version = VERSION_NAME

            // aar文件所在的位置
            // module打包後所在路徑爲module模塊下的build/outputs/aar,生成的aar名稱爲:module名-release.aar
            artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")

            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.api.allDependencies.each { dependency ->
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dependency.group)
                    dependencyNode.appendNode('artifactId', dependency.name)
                    dependencyNode.appendNode('version', dependency.version)
                }
            }
        }
    }
}

重點就在於:configurations.api.allDependencies.each,在該工程中我們使用的是api 'com.google.code.gson:gson:2.8.5'的方式,所以這裏使用了 configurations.api,如果你使用的是implementationd等的話,也需要換成相應的語法(具體需要哪些依賴,過濾哪些依賴等需要你自己在循環中處理)。然後publish的時候,它會幫我們檢查module中所有的api依賴,將其寫入到pom文件中。
結果如下所示,pom文件中已經聲明瞭我們需要的gson依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.cooloongwu.hello</groupId>
  <artifactId>hello.native</artifactId>
  <version>0.0.1</version>
  <packaging>aar</packaging>
  <dependencies>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.5</version>
    </dependency>
  </dependencies>
</project>

此時上傳aar和pom文件到構件倉庫,然後當依賴該構件時,gradle會自動將gson的依賴也下載下來。

三、總結

我在開發的時候其實也遇到了這樣的問題,然後網上查看了很多文章,都是那種類似的
transitive = true,太扯了吧,transitive的使用場景都不對。
所以其實還是我們對 maven 的 api 不熟悉,還是需要多多查看官網文檔,然後可以知道這種場景下我們使用 pom.withXml即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章