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
即可。