美文网首页
SDK集成第三方依赖发布Maven的方法

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

作者: SYfarming | 来源:发表于2018-11-07 17:04 被阅读43次

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

    compile(name:'aarName',ext:'aar')
    

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

    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    

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

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

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

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

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

    repositories {
            maven { url "$rootDir/repo" }
            google()
            jcenter()
        }
    

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

    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即已包含了依赖第三方内容:如下所示;
    <?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>
    

    在使用过程中直接使用:

    implementation('com.anymarvel.test:AnyMarvel:1.0')
    

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



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

    implementation('com.anymarvel.test:AnyMarvel:1.0') {
            exclude group: 'com.android.support'
            exclude group: 'com.squareup.okhttp3'
        }
    

    有问题请留言

    相关文章

      网友评论

          本文标题:SDK集成第三方依赖发布Maven的方法

          本文链接:https://www.haomeiwen.com/subject/nlwvxqtx.html