AndroidStudio加速之--(四)发布aar到Artifactory并包含其他依赖

AndroidStudio加速之--(四)发布aar到Artifactory并包含其他依赖

    • 一、前言
    • 二、解决办法
        • 2.1、让其他人员自行添加gson依赖
        • 2.2、将gson依赖添加到pom文件
    • 三、总结

一、前言

经过前面一些列的开发,我们已经将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
文件内容大致如下所示:


<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.0modelVersion>
  <groupId>com.cooloongwu.hellogroupId>
  <artifactId>hello.nativeartifactId>
  <version>0.0.1version>
  <packaging>aarpackaging>
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依赖:


<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.0modelVersion>
  <groupId>com.cooloongwu.hellogroupId>
  <artifactId>hello.nativeartifactId>
  <version>0.0.1version>
  <packaging>aarpackaging>
  <dependencies>
    <dependency>
      <groupId>com.google.code.gsongroupId>
      <artifactId>gsonartifactId>
      <version>2.8.5version>
    dependency>
  dependencies>
project>

此时上传aar和pom文件到构件仓库,然后当依赖该构件时,gradle会自动将gson的依赖也下载下来。

三、总结

我在开发的时候其实也遇到了这样的问题,然后网上查看了很多文章,都是那种类似的
transitive = true,太扯了吧,transitive的使用场景都不对。
所以其实还是我们对 maven 的 api 不熟悉,还是需要多多查看官网文档,然后可以知道这种场景下我们使用 pom.withXml即可。

你可能感兴趣的:(Android-NDK,Android-架构模式,Android-组件化,aar嵌套依赖,aar包含其他依赖)