Android库发布到Maven Central全攻略

5,924 阅读5分钟

Android库发布到Maven Central全攻略

前言

最近听说jCenter要关闭,搞的人心惶惶,寻思着迁移到别的库吧半天找不到一个靠谱点的,最终找到了与jCenter齐名的Maven Central,但Maven Central的申请和配置是要比jForg那边的bintray麻烦得多的,如何注册上传库到Maven Central就变得非常困难了,网上找了一圈基本都是Java库的上传攻略,无奈只能到Google上找资料+看官方文档总算在今天下午搞定了上传包的全过程,本文将详细描述Android库发布到Maven Central全攻略。本文发表在大话安卓小专栏,禁止一切未授权的转载行为。

第一步·注册

与jCenter是由jForg运营,在bintray.com做管理一样,Maven Central是由sonatype运营的,那么首先需要去注册一个sonatype的账号并获得仓库使用许可。

你需要先前往issues.sonatype.org注册账号,界面如图,点击红框部分:

注册需要填写邮箱(重要,请填写真实的邮箱)、名字、用户名(重要,用于登录)、密码(需要含符号、英文和数字的复杂密码),和验证码完成注册。

小提示,sonatype.org实际上是支持中文的,登录后会提示你切换语言,非常友好。

名称直接填写项目名就行,重点是Group ID,这里如果你没有自己的网站域名,那么一般建议按照Github填写,例如你的Github为github.com/kongzue,那么这里可以写成com.github.kongzue,如果有你自己的域名,则可以按照你的域名翻转作为你的主地址,另外注意,这个申请实际上只需要申请一次,那么Group Id建议直接设置成主包名,不需要具体到项目,例如我的项目都是com.kongzue开头的,那么这里不要具体到com.kongzue.dialogv3,因为申请后你的所有项目都可以放到com.kongzue开头的maven仓库下。

额外需要注意的是,如果使用自己的域名,需要按照官方的要求,在DNS配置配置一个TXT记录指向你的Github地址来完成验证,这个比较麻烦,具体参考:central.sonatype.org/pages/produ…

申请后请耐心等待官方的回复,待issues状态变为已解决,那么就说明申请成功了,如果有任何不成功的,官方会在下方给出注释,你也可以通过注释回复官方,完成申请。

第二步·Gradle准备

接下来需要进入你的项目,完成一系列的配置,请先参考下载下边的gradle文件放置在项目的根目录,请注意文中中文部分请按照需要自行修改:

文件:publish-mavencentral.gradle

apply plugin: 'maven-publish'
apply plugin: 'signing'

task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.source
}

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) {
            // 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 = '你的项目描述'
                // If your project has a dedicated site, use its URL here
                url = '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'
                        name = '用户名'
                        email = '邮箱'
                    }
                }
                // 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://oss.sonatype.org/service/local/staging/deploy/maven2/"
            def snapshotsRepoUrl = "https://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
}

完成后进入你的local.properties文件,添加如下:

signing.keyId=XXXXXXXX
signing.password=密码
signing.secretKeyRingFile=D\:/key/你的GPG签名秘钥文件.gpg
ossrhUsername=sonatype帐号
ossrhPassword=sonatype密码

第三步·签名秘钥申请

这里需要一个GPG秘钥,需要下载GPG管理器客户端完成申请:

www.gpg4win.org/get-gpg4win…

此软件是支持中文的,请放心使用,如下图,点击不捐助,点击下载安装即可。

安装完成后,点击主界面菜单,新建秘钥

点击第一个选项,创建个人秘钥:

接下来输入你的账号、邮箱以及勾选Protect the generated key with a passphrase. (使用密码保护生成的密钥)在高级设置里可以设置更详细的,例如过期时间,但过期时间不可以太长,或报错。

下一步,设置密码,完成,在完成界面先不用急着上传或备份,直接点击完成。

在主界面双击你创建的秘钥,可以看到以下界面

请记住下边红框圈住的8位字母,复制下来,一会要用。点击生成吊销证书按钮,保存下来你的吊销证书,然后回到主界面点击右键,在服务器发布:

接下来再次右键,点击导出,重命名导出文件后缀,导出为gpg格式的文件。

回到Android Studio,到local.properties文件中,编辑刚刚的文件:

signing.keyId=02C4AC4B
signing.password=你的秘钥密码
signing.secretKeyRingFile=D\:/key/你的GPG签名秘钥文件.gpg
ossrhUsername=sonatype帐号
ossrhPassword=sonatype密码

完成编辑。

第四步·上传

先进入你的Module的build.gradle,添加以下代码:

ext {
    PUBLISH_GROUP_ID = "com.xxx.xxxx"		//项目包名
    PUBLISH_ARTIFACT_ID = 'xxxx'			//项目名
    PUBLISH_VERSION = 0.0.1					//版本号
}
apply from: "${rootProject.projectDir}/publish-mavencentral.gradle"

Sync后,先通过Gradle编译release版本,双击Module名称/Tasks/build/assemble:

完成后,上传到Maven Central,双击Module名称/Tasks/publishing/publicReleasePublicationToXXXRepository

执行完毕后,进入oss.sonatype.org/ ,使用你的sonatype帐号和密码登录。

进入左侧的Staging Repositories

在右上角搜索你的名字,应该能找到你上传的库文件,点击下方的Content可以查看详细已上传的文件:

确认无误后,点击Close关闭,输入介绍后点击Confirm完成所有操作。

接下来,需要等待5-10分钟,待Activity选项卡中出现对号的“Repository closed”即完成准备,然后点击Release按钮发布到MavenCentral,等待几个小时后可以在 search.maven.org/ 查询发布结果。

结束

以上就是Android库发布到Maven Central全攻略了,本文发表在大话安卓小专栏,禁止一切未授权的转载行为。如有疑问也欢迎加群271127803进行讨论。