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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值