美文网首页开源库android
通过AndroidStudio发布 aar库 到MavenCen

通过AndroidStudio发布 aar库 到MavenCen

作者: Junker_ | 来源:发表于2022-04-27 21:17 被阅读0次

    前言:

    将 aar库 发布到 MavenCentral有以下几步:

    1. sonatype 注册账号并创建问题,最终至问题结果为“已修复”
    2. 下载 GnuPG 创建密钥,将密钥保存至本地并将公钥发送至公钥服务器
    3. 在AndroidStudio上配置好 sonatype 信息及 GnuPG 签名,提交 aar库 至 nexus 暂存
    4. 使用 sonatype 账号登录 nexus 查看上传的aar库,确认无误后完成发布。
    5. 发布完成,审核通过后可在 https://search.maven.org/ 搜索查看。
    6. 完结撒花~
    • 接下来将详细说明每个步骤

    一:去 sonatype 注册账号并创建问题,最终至问题结果为“已修复”

    1.1 第一次需要先注册账号

    1.2 创建Project工单

    1.3 开通仓库
     创建好工单后,根据评论提示在个人仓库创建一个项目用于校验,例如我的是创建名称为“OSSRH-80195”项目
    
    1.4 github 创建<OSSRH-80195>工程

    1.4 以上准备工作都完成后,回复下评论,待管理员审核

    1.5 审核通过后,项目状态会变成:已解决

    二:下载 GnuPG 并创建GPG签名保存至本地待使用

    2.1 按照下面指引下载 GnuPG exe文件下载,默认安装即可。

    2.2 安装 gpg 完成之后,可以在cmd 命令行查看是否安装成功
    2.3 创建密钥,通过 cmd 命令行创建并发布公钥至公钥服务器,想通过 gpg exe程序操作点 这里

    注:网上有人是直接通过“Kleopatra.exe”程序界面操作的,不过我在最后一步“在服务器上发布...”一直发布失败,所以就通过命令行的方式操作,如果有知道如何解决的大佬可以评论区留言哈,感谢~。
    报错如下:
    gpg.exe 的输出为:gpg: sending key 231883C5xxxxxxxx to hkps://keyserver.ubuntu.com gpg: keyserver send failed: Certificate expired gpg: keyserver send failed: Certificate expired

    • 2.3.1 生成密钥
      gpg --gen-key
    
    • 2.3.2 查看密钥
      gpg --list-key
    
    • 2.3.3 导出密钥

    如果gradle签名的时候报密钥文件中找不到指定的 key ID的key的错误,此时可以手动导出

      gpg --export-secret-keys > 某盘:\...\gnupg\secring.gpg
    
    • 2.3.4 公钥发送至公钥服务器

    keyserver.ubuntu.com
    keys.openpgp.org
    pgp.mit.edu
    各个公钥服务器之间互相同步需要一定时间,可以提前发送到这三个服务器,查看最新服务器地址点 这里

      gpg --keyserver keyserver.ubuntu.com --send-keys keyId
    
      gpg --keyserver keys.openpgp.org --send-keys keyId
    
      gpg --keyserver pgp.mit.edu --send-keys keyId
    
    • 注:以上三个服务器地址只要保证其中一个发送成功即可

    • 2.3.6 查询公钥是否上传成功
      gpg --keyserver hkp://pool.sks-keyservers.net --search-keys keyId
    
      gpg --keyserver hkp://pgp.mit.edu --search-keys keyId
    
      gpg --keyserver hkp://keyserver.ubuntu.com --search-keys keyId
    

    三:在AndroidStudio上配置好 sonatype 信息及 GnuPG 签名,提交 aar库 至 nexus 暂存

    3.1 在项目根目录创建一个新的"xxx.gradle"文件,用于maven上传,并添加如下代码。

    我这里取的文件名是:publish-mavencentral.gradle

    apply plugin: 'maven-publish'
    apply plugin: 'signing'
    
    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.source
    
        exclude "**/R.class"  //排除`R.class`
        exclude "**/BuildConfig.class"  //排除`BuildConfig.class`
    }
    
    //--- 修改配置一 ---
    ext {path=
        PUBLISH_GROUP_ID = '之前注册sonatype时填写的的的groupId域名,如果是github的则是io.github.xxx'
        PUBLISH_ARTIFACT_ID = '库的名称'
        PUBLISH_VERSION = '库的版本'
    }
    
    //--- 修改配置二 ---
    ext["signing.keyId"] = ''
    ext["signing.password"] = ''
    ext["signing.secretKeyRingFile"] = ''
    ext["ossrhUsername"] = ''
    ext["ossrhPassword"] = ''
    
    File secretPropsFile = project.rootProject.file('local.properties')
    if (secretPropsFile.exists()) {
        println "Found secret props file, loading props"
        Properties p = new Properties()
        p.load(new FileInputStream(secretPropsFile))
        p.each { name, value ->
            ext[name] = value
        }
    } else {
        println "No props file, loading env vars"
    }
    publishing {
        publications {
            release(MavenPublication) {
                println("publish-maven Log-------> PUBLISH_GROUP_ID: $PUBLISH_GROUP_ID; PUBLISH_ARTIFACT_ID: $PUBLISH_ARTIFACT_ID; PUBLISH_VERSION: $PUBLISH_VERSION")
                // The coordinates of the library, being set from variables that
                // we'll set up in a moment
    
                //配置一传入的参数
                groupId PUBLISH_GROUP_ID
                artifactId PUBLISH_ARTIFACT_ID
                version PUBLISH_VERSION
    
                // Two artifacts, the `aar` and the sources
                artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
                artifact androidSourcesJar
    
                // Self-explanatory metadata for the most part
                pom {
                    //--- 修改配置三 ---
                    name = PUBLISH_ARTIFACT_ID
                    description = '上传aar插件至mavencentral,方便使用implementation快速引入' //添加文件描述
                    // If your project has a dedicated site, use its URL here
                    url = 'https://github.com/xxx/xxxx' //项目github链接
                    licenses {
                        license {
                            //协议类型,一般默认Apache License2.0的话不用改:
                            name = 'The Apache License, Version 2.0'
                            url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        }
                    }
                    developers {
                        developer {
                            //--- 修改配置四 ---
                            id = '用户ID'     //你的sonatype用户ID
                            name = '用户名'   //你的sonatype用户名
                            email = '邮箱'    //你的sonatype注册邮箱
                        }
                    }
                    // Version control info, if you're using GitHub, follow the format as seen here
                    scm {
                        //--- 修改配置五 ---
                        //修改成你的Git地址:
                        connection = 'scm:git:github.com/xxx/xxxx.git'
                        developerConnection = 'scm:git:ssh://github.com/xxx/xxxx.git'
                        //分支地址:
                        url = 'https://github.com/xxx/xxxx/tree/master'
                    }
                    // A slightly hacky fix so that your POM will include any transitive dependencies
                    // that your library builds upon
                    withXml {
                        def dependenciesNode = asNode().appendNode('dependencies')
    
                        project.configurations.implementation.allDependencies.each {
                            def dependencyNode = dependenciesNode.appendNode('dependency')
                            dependencyNode.appendNode('groupId', it.group)
                            dependencyNode.appendNode('artifactId', it.name)
                            dependencyNode.appendNode('version', it.version)
                        }
                    }
                }
            }
        }
        repositories {
            // The repository to publish to, Sonatype/MavenCentral
            maven {
                // This is an arbitrary name, you may also use "mavencentral" or
                // any other name that's descriptive for you
    
                //--- 修改配置六 ---
                name = "项目名称"
                def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
                def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
                // You only need this if you want to publish snapshots, otherwise just set the URL
                // to the release repo directly
                url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
    
                // The username and password we've fetched earlier
                credentials {
                    username ossrhUsername
                    password ossrhPassword
                }
            }
        }
    }
    signing {
        sign publishing.publications
    }
    

    针对以上代码,有几处需要修改成自己的配置信息

    • 3.1.1 修改配置一:填入需要使用 implementation 引入aar的格式
    ext {path=
        PUBLISH_GROUP_ID = '之前注册sonatype时填写的的的groupId域名,如果是github的则是io.github.xxx'
        PUBLISH_ARTIFACT_ID = '库的名称'
        PUBLISH_VERSION = '库的版本'
    }
    //以上三个参数分别对应的是 implementation 'io.github.Junkmer:JRouter:0.0.1' 冒号从左往右分割的三部分
    
    • 3.1.2 修改配置二:在项目的根目录local.properties文件中增加如下配置
    signing.keyId=5D31B52D                         //刚才获取的秘钥后8位
    signing.password=xxxx                          //创建GPG秘钥时设置的密码
    signing.secretKeyRingFile=.../xxx.gpg          //生成的.gpg结尾的密钥文件目录
    ossrhUsername=XXX                              //sonatype用户名
    ossrhPassword=XXX                              //sonatype密码
    
    • 3.1.3 修改配置三:配置项目描述和项目GitHub地址
    name = PUBLISH_ARTIFACT_ID  //使用配置一中的"库名称"参数
    description = '上传aar插件至mavencentral,方便使用implementation快速引入' //添加文件描述
    url = 'https://github.com/xxx/xxxx' //项目github链接
    
    • 3.1.4 修改配置四: 填写在 sonatype 注册的账号信息
    id = '用户ID'     //你的sonatype用户ID
    name = '用户名'   //你的sonatype用户名
    email = '邮箱'    //你的sonatype注册邮箱
    
    • 3.1.5 修改配置五:将模板中的"xxx/xxxx"替换成自己的github项目真实地址
    //修改成你的Git地址:
    connection = 'scm:git:github.com/xxx/xxxx.git'
    developerConnection = 'scm:git:ssh://github.com/xxx/xxxx.git'
    //分支地址:
    url = 'https://github.com/xxx/xxxx/tree/master'
    
    • 3.1.6 修改配置六:配置项目名称和发布地址
    name = "项目名称"  //填写在github创建的项目名称
    def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
    def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
    

    注:由于 https://oss.sonatype.org 不再维护,新地址修改成 https://s01.oss.sonatype.org,想查看最新地址点 这里

    3.2 执行aar打包和上传

    先在需要打包上传的module下的build.gradle,添加以下代码:

    apply from: "${rootProject.projectDir}/publish-mavencentral.gradle"
    
    • 3.2.3 以上都配置好后,在AndroidStudio右侧的gradle tasks中找到要提交的module,点击“4”任务。
    • 3.2.3 上传成功,控制台会有如下打印,然后就可以在 nexus 上查看了

    四:使用 sonatype 账号登录 nexus 查看上传的aar库,确认无误后完成发布。

    4.1 登录 nexus
    4.2 确认aar库无误后,点击 "release" 按钮提交审核。

    五:发布完成,审核通过后可在 https://search.maven.org/ 搜索查看。

    六:完结撒花~

    特别感谢:

    相关文章

      网友评论

        本文标题:通过AndroidStudio发布 aar库 到MavenCen

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