SDK集成第三方依赖发布Maven的方法

2018-12-10 10:32:10 浏览数 (1)

转载是一种动力 分享是一种美德

aar引用很简单,将aar复制到libs包下,在项目的build.gradle文件中增加以下代码即可(以aarName.aar为为例):

代码语言:javascript复制
compile(name:'aarName',ext:'aar')

但是如果aar中包含了远程依赖,例如aar中依赖了第三方库:

代码语言:javascript复制
implementation 'com.squareup.okhttp3:okhttp:3.10.0'

若采用上面的方法引用则在运行时会找不到okhttp3 库中的类。

针对这种问题可以采用maven仓库来解决,我们可以将aar生成到本地或远程maven仓库,再引用仓库中的aar。或上传maven仓库到服务端或着私服等都可.

脚本配置如下: gradle.properties设置内容如下:

代码语言:javascript复制
#版本号
versionCode=1.0
#上传artifactId名称
artifactIdName=AnyMarvel
#上传groupId名称
groupIdValue=com.anymarvel.test
#maven私服用户名
MAVEN_USERNAME=
#maven私服密码
MAVEN_PASSWORD=
# 是否使用本地maven仓库
useLocal=true

若使用本地maven仓库,需要在根目录maven引用中加入maven仓库地址引用:如

代码语言:javascript复制
repositories {
        maven { url "$rootDir/repo" }
        google()
        jcenter()
    }

在module工程build.gradle脚本最下方加入如下脚本配置

代码语言:javascript复制
apply plugin: 'maven-publish'publishing {
    publications {
        aarSDk(MavenPublication) {
            artifact "build/outputs/aar/Anymarvel-debug.aar"
            groupId groupIdValue
            artifactId artifactIdName
            version versionCode
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.implementation.allDependencies.withType(ModuleDependency) { ModuleDependency dp ->                    if (dp.version != "unspecified") { // 过滤项目内library引用
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', dp.group)
                        dependencyNode.appendNode('artifactId', dp.name)
                        dependencyNode.appendNode('version', dp.version)                        // for exclusions
                        if (dp.excludeRules.size() > 0) {
                            def exclusions = dependencyNode.appendNode('exclusions')
                            dp.excludeRules.each { ExcludeRule ex ->
                                def exclusion = exclusions.appendNode('exclusion')
                                exclusion.appendNode('groupId', ex.group)
                                exclusion.appendNode('artifactId', ex.module)
                            }
                        }
                    }
                }
            }
        }
    }

    repositories {
        maven {            if (!Boolean.parseBoolean(useLocal) && project.hasProperty('MAVEN_USERNAME') && project.hasProperty('MAVEN_PASSWORD')) {
                url "这里填入maven 私服地址"
                credentials {
                    username MAVEN_USERNAME
                    password MAVEN_PASSWORD
                }
            } else {
                url "$rootDir/repo"

            }


        }
    }

}task publishToMaven(dependsOn: ['assemble', 'publish']) {
    doLast {        if (!Boolean.parseBoolean(useLocal)) {
            println "finish publish  to  maven"
        } else {
            println "finish publish  to  maven directory:--> $rootDir/repo"

        }
    }
}

publishToMaven.setGroup('SDKPush')

点击同步gradle后在module模块下的task目录会出现如下group

双击publishToMaven 的task任务即可根据配置上传. 本地目录上传会在根目录生成repo仓库,如图所示:

其中的AnyMarvel-1.0.pom即已包含了依赖第三方内容:如下所示;

代码语言:javascript复制
<?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.anymarvel.test</groupId>
  <artifactId>AnyMarvel</artifactId>
  <version>1.0</version>
  <packaging>aar</packaging>
  <dependencies>
    <dependency>
      <groupId>com.android.support</groupId>
      <artifactId>recyclerview-v7</artifactId>
      <version>26.1.0</version>
    </dependency>
    <dependency>
      <groupId>com.android.support</groupId>
      <artifactId>appcompat-v7</artifactId>
      <version>26.1.0</version>
    </dependency>
    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>3.10.0</version>
    </dependency>
  </dependencies></project>

在使用过程中直接使用:

代码语言:javascript复制
implementation('com.anymarvel.test:AnyMarvel:1.0')

会同步maven中指定的依赖库及版本,若工程中和aar中依赖版本由冲突会由报错,使用如下方法进行规避: 报错内容如下:

使用如下如下方法规避即可:

代码语言:javascript复制
implementation('com.anymarvel.test:AnyMarvel:1.0') {
        exclude group: 'com.android.support'
        exclude group: 'com.squareup.okhttp3'
    }

有问题请留言

0 人点赞