组件化使用Maven Publish Plugin上传aar至maven仓库

1,502 阅读2分钟

组件化开发时会把一些基础库拉出来作为SDK让多个业务线共同使用,所以我们会把这些库打包成aar包然后上传至Maven仓库供业务方依赖使用。

1.了解下POM

POM(Project Object Model)指项目对象模型,用于描述项目构件的基本信息。一个有效的 POM 节点中主要包含一下信息:

配置描述举例('com.squareup.retrofit2:retrofit.2.6.0')
groupId组织 / 公司的名称com.squareup.retrofit2:retrofit
artifactId组件的名称retrofit
version组件的版本2,6.0
packaging打包的格式aar/jar

pom的作用

如果我们的aar库里面又依赖了其他的第三方库,我们在直接打包的时候其他第三方库是不会被打进我们的aar包里的,这个时候有三种处理方式

  1. 让业务方自己添加我们AAR包的第三方依赖,这种是不太好的也不方便。
  2. 通过工具(fataar)将第三方依赖打进我们的aar包里,这种也不太好,会出现依赖冲突需要去解决等问题
  3. 使用pom文件,依赖项配置用于定义项目所依赖的外部库。Maven会自动下载并管理这些依赖项。文件格式为
<dependency>
      <groupId>com.squareup.retrofit2</groupId>
      <artifactId>retrofit</artifactId>
      <version>2.6.0</version>
      <scope>implementation</scope>
    </dependency>

2.使用Maven Pubilsh Plugin

maven publish 插件文档docs.gradle.org/7.3/usergui…

使用方法

新建一个gradle文件,配置如下


apply plugin: 'maven-publish'
afterEvaluate {
    publishing {
        publications {
            maven(MavenPublication) {
                groupId = ******
                artifactId = '****'
                if (Boolean.valueOf(IS_RELEASE)) { //IS_RELEASE是在其他地方统一的配置开关
                    version = VERSION_NAME
                     artifact(tasks.getByName("bundleReleaseAar"))  //上传源码方法任务调用
                } else {
                    version = VERSION_NAME + "-snapshop"
                   artifact(tasks.getByName("bundleDebugAar"))
                }
                artifact(androidSourcesJar)
                pom.withXml {
                    def dependenciesNode = asNode().appendNode('dependencies')
                    configurations.implementation.allDependencies.each {
                        if (it.group != null && (it.name != null && "unspecified" != it.name) && it.version != null) {
                            println "dependency=${it.toString()}"
                            def dependencyNode = dependenciesNode.appendNode('dependency')
                            dependencyNode.appendNode('groupId', it.group)
                            dependencyNode.appendNode('artifactId', it.name)
                            dependencyNode.appendNode('version', it.version)
                            dependencyNode.appendNode('scope', 'implementation')
                        }
                    }
                }
            }
        }
        repositories {
            maven {
                if (Boolean.valueOf(IS_RELEASE)) {
                    url = MAVEN_RELEASE_URL
                } else {
                    url = MAVEN_SNAPSHOT_URL
                }
                credentials {
                    username = MAVEN_USERNAME
                    password = MAVEN_PASSWORD
                }
            }
        }
    }
}

task androidSourcesJar(type: Jar) { //上传源码,对kotlin项目很有用
    archiveClassifier.set('sources')
    from android.sourceSets.main.java.srcDirs
}

然后在你需要使用的地方 apply from: "*****.gradle"也就是你的gradle文件就可以OK了。在需要上传的时候,点击gradle的publishing就会自动上传到你的maven仓库了

图片.png 业务方在使用的时候直接依赖就可以了。