项目发布到MavenCentral的流程

1、注册sonatype账号

首先前往【https://issues.sonatype.org】注册账号

注册需要填写邮箱(重要,请填写真实的邮箱)、名字、用户名(重要,用于登录)、密码(需要特别复杂的组合密码),和验证码完成注册。

2、创建Project工单

在顶部的栏目中找到新建按钮

进入到创建问题页面,基础信息安装图片里的描述填写即可,

域名前缀分两种:

1)你没有自己的域名,并且你的代码托管在github上,你可以使用io.github.xxx来作为域名前缀,xxx指你的github的账号名称,在新建完问题后,需要在你自己的github上面创建一个问题编号的空项目,用来给管理员验证申请的这个github的归属权是你自己的(如下面的步骤3所示)。

2)如果有有自己的域名,或者想要注册购买一个自己的域名(这里以阿里云为例),你新建完问题后,首先在阿里云选择一个自己满意的域名并实名认证后购买。然后进入域名服务,点击域名列表里你自己的域名,进入域名解析,选择解析设置。然后点击添加记录。

在添加记录里的记录类型选中TXT,然后记录值里填写你创建的那个问题的URL路径,TTL选择1天。

填写完成这些信息后,就可以create了,create完成后,你的单子会自动assign给工作人员 

3.开通仓库

       工作人员会根据你填写的GroupId的方式,来要求你配合完成一些验证,会在comments里面回复你,在这边,我只说明github的验证方式,域名方式则可自行百度查看验证方式。


然后要求我们在自己的github账号里创建一个public的名称为你这个Ticket的repository,很简单,直接创建一个,注意 Repository名称以及权限是public即可 

 我这边报红是因为这个名字已经创建过了,正常是不会有这问题的,可以忽略。

这样就完成了,然后我们就可以立马去刚刚的Ticket的comments里面告诉工作人员,我们已经完成了这一步

 


接下来的步骤,我们就是等待了,等待工作人员回复完成即可进行下一步了,我在这一步等待的时间很快,应该不到半小时,至于为什么要等待,可以查看官网的解释https://central.sonatype.org/faq/a-human/

到这一步,我们的Maven仓库就已经可以使用了,使用这个地址进行登录https://s01.oss.sonatype.org,用户名密码就是你上面注册的工单系统的账密,接下来我们就可以准备我们需要上传的库了。

4.创建GPG签名

GPG签名主要是为了给需要发布到maven central的包进行签名,每个发布上去的包都需要进行这个操作,为了接下来我们可以直接使用,我们所以我们先创建一个自己的GPG签名。关于GPG的概念,大家可以自行学习。

下载GPG

可以从以下地址进行下载:Gpg4win - Get Gpg4winicon-default.png?t=L892https://www.gpg4win.org/get-gpg4win.html


下载完成后,进行安装,默认都下一步即可完成。

 

安装完成后,在命令行中,可以查看一下版本,来确认环境以及安装是否成功


创建GPG密钥
 

点击主界面菜单,新建秘钥

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

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

 下一步,设置密码,完成,在完成界面先不用急着上传或备份,直接点击完成。 在主界面双击你创建的秘钥,可以看到以下界面 请记住下边红框圈住的8位字母,复制下来,一会要用。点击生成吊销证书按钮,保存下来 你的吊销证书

 然后回到主界面点击右键,点击Backup Secret Keys 生成.gpg结尾的的密钥,后面上传是需要用到

 然后在对应的证书右键点在服务器上发布,但是往往都是不成功的,

 一般会提示以下的错误

 那要怎么处理呢,替换上传的链接

gpg --keyserver keyserver.ubuntu.com --send-keys 【your public key】
gpg --keyserver keys.openpgp.org --send-keys 【your public key】
gpg --keyserver pgp.mit.edu --send-keys 【your public key】

 上面的【your public key】替换为之前要保存的8位字母,一般情况这3个中肯定有一个是可以上传成功的。

发生成功你对应的邮箱会收到来自:keyserver的邮件,大致意思是说我为绑定邮箱信息,让我去绑定,具体看收到的邮件提示进行操作。进行绑定后又会收到另外一条绑定成功的邮件。

对应的证书上传成功后,开始上传对应的项目。

5.As中的配置

  • 在需要上传的lib里的build.gradle文件里的顶部增加配置

apply from: 'publish.gradle'

  •  然后在同一目录底下新建一个publish.gradle文件,然后把下面的内容复制进去

 

 publish.gradle文件:

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

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

    exclude "**/R.class"
    exclude "**/BuildConfig.class"
}

ext {path=
    PUBLISH_GROUP_ID = '之前注册申请的域名,如果是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) {
            // 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 = 'maven_test项目描述-需要修改成你自己的'
                // 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 = '这里sonatype用户名修改为自己的'
                        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/xxx.git'
                    //分支地址:
                    url = 'https://github.com/xxx/xxx/tree/main'
                }
                // 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 = "mavenCentral"

            def releasesRepoUrl = "https://s01.oss.sonatype.org/content/repositories/releases/"
            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
}

6、上传开源库

  • 在需要上传时,在local.properties文件里写入下面内容,上传完删掉(这些个人配置不要公开)

signing.keyId=5D31B52D     //获取的秘钥后8位
 signing.password=xxxx    //注册时GPG中设置的密码
 signing.secretKeyRingFile=E\:/xxx/.../xxx.gpg  //生成的.gpg结尾的密钥文件目录
 ossrhUsername=XXX       //sonatype用户名
 ossrhPassword=XXX       //sonatype密码
  • 找到想要上传的lib的task,双击运行assemble编译。 

  • 上一步运行结束后双击运行publishReleasePublicationToMavenLocalRepository上传aar,提示成功后即上传成功 

 如果上传成功了在sonatype里也会收到工作人员的回复信息:

  • 查看是否上传成功

意思就是你的库上传成功了,过一会可以在

Central Repository: icon-default.png?t=L892https://repo1.maven.org/maven2/

这个地址中查到你自己的库, 在这个连接后面对应的PUBLISH_GROUP_ID对应的路径,.用/代替,就能看对你对应的库

 PUBLISH_GROUP_ID = '之前注册申请的域名,如果是github的则是io.github.xxx'
    PUBLISH_ARTIFACT_ID = '库的名称'
    PUBLISH_VERSION = '库的版本'

 像我的,是这样的,能查的到,就代表上传成功了,可以进行引用了。

还可以在这个https://search.maven.org/ Maven Central Repository Search 连接中通过搜索你自己的域名或者对呀的GitHub对应io.github.xxx即可找到,不过这时间可能会比较久

 

7.AS对库的引用

在项目顶部的build.gradle文件中,进行引用,对呀的路径为

  PUBLISH_GROUP_ID:PUBLISH_ARTIFACT_ID:PUBLISH_VERSION
  域名:库的名称:库的版本

8.注意事项

有的并不能很顺利的使用GPG来进行生成对应的证书,则可以采用cmd来进行生成,可以参考对应的文章发布Android Lib库(Jar、AAR、SO)到Maven Central,全面避坑教程_xiaozeiqwe的专栏-CSDN博客本文主要以Gradle Maven Publish插件的方式进行发布到Maven Central的流程进行说明,附带了手动发布的流程、so库的发布流程、不上传源码和doc的发布流程,并提及说明了发布Jar包和发布aar包的不同方式、Java与Kotlin版本的不同打包方式。https://blog.csdn.net/xiaozeiqwe/article/details/117379335
   

猜你喜欢

转载自blog.csdn.net/u012693479/article/details/120508108