使用Gradle发布构件(Jar)到Maven中央仓库

OSSRH

在开始以前,先对 OSSRH作下了解是很必要的,由于一开始,我并不知道这是个啥玩儿意。我想和我同样的人应该仍是有不少的。

OSSRHSonatype Open Source Software Repository Hosting Service,为开源软件提供maven仓库托管服务。你能够在上面部署snapshot、release等,最后你能够申请把你的release同步到Maven Central RepositoryMaven中央仓库)。html

我的的理解,OSSRHMaven中央仓库的前置审批仓库,只有你彻底符合了发布要求,成功的将你的项目发布到了OSSRH,才有机会申请同步到Maven中央仓库java

这篇主要是记录这整个流程,方便之后本身查阅,同时能够帮助到想作一样事情的朋友。git

一、注册Sonatype JIRA帐号

JIRA是Atlassian公司出品的项目与事务跟踪工具,被普遍应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工做领域。

网址:https://issues.sonatype.org/github

无非就是填写下注册信息,没有什么特别的apache

二、建立一个Issue

填写资料

能够在头部看到一个Create的按钮ubuntu

sonatype-create-issue-button

会弹出Create Issue表单bash

sonatype-create-issue-form

  • Project:选择Community Support - Open Source Project Repository Hosting (OSSRH)
  • Issue Type:选择New Project
  • Summary:写个标题作个简单概述你要作啥。真不知道写什么,直接把项目名称写上就行,我就这么干了哈。
  • Group Id服务器

    • 本身有域名
      可使用子域名做为Group Id 。例:个人项目叫paladin2,那么就用org.zhangxiao.paladin2做为Group Id网络

      注意:不能瞎编一个,由于后面审核人员会来审核你是不是该域名的拥有者
    • 本身没域名
      能够借助github,例:个人用户名为michaelzx,那么就用com.github.michaelzx.paladin2做为做为Group Id
  • Project URL:要与Group Id必定关联性app

    • 例1:
      Project URL=http://paladin2.zhangxiao.org
      Group Id=org.zhangxiao.paladin2
    • 例2:
      Project URL=https://github.com/michaelzx/Paladin2
      Group Id=com.github.michaelzx.paladin
  • SCM url:版本仓库的拉取地址

等待回复

若是有问题,老外在评论中把问题给你指出来,能够在原有的issue把资料改正确

我以前是犯了个低级的错误把 Group Id写成了域名
审核人员要处理的issue不少,你可能要耐心等待一会,不要急
我以前急了,就从新提交了2个新的issue,最后管理员仍是耐心的把重复的issue关闭

若是一切顺利,那么你会收到审核人员,这样的一个评论:

sonatype-create-issue-success

三、准备工做

文件要求

为了确保中央存储库中可用组件的质量水平,OSSRH对提交的文件有明确的要求。

一个基础的提交,应该包含一下文件:

example-application-1.4.7.pom
example-application-1.4.7.pom.asc
example-application-1.4.7.jar
example-application-1.4.7.jar.asc
example-application-1.4.7-sources.jar
example-application-1.4.7-sources.jar.asc
example-application-1.4.7-javadoc.jar
example-application-1.4.7-javadoc.jar.asc
  • 除了jar包和pom文件,JavadocSources是必须的,后面会说到用Gradle的一些插件来生成
  • 每一个文件都有一个对应的asc文件,这是GPG签名文件,能够用于校验文件

GPG

安装

说明:后续过程均在OSX环境下

OSX下能够经过brew来安装gpg命令行工具

$ brew update
$ brew install -v gpg

你会发现从brewgpg命令行工具,作了国际化支持,连help都是中文,赞👍

另外推荐一个工具 GPG Suite传送门
在OSX提供了一个图形化界面,把GPG做为钥匙串来作管理,蛮有意思,不过感受缺失点功能

Windows下
能够安装gpg4win,网址:传送门
页面最上面有个很大的下载按钮,点了之后,貌似会让你捐个款啥的……
不过你能够往下看,有全部版本的列表地址,能够跳过捐款,在祭上一个传送门
人家只是隐藏的好了一些而已,仍是免费的。装完了之后,在命令行中也能够用gpg了

公钥、私钥、签名

GPG的默认秘钥类型是RSA,这里涉及涉及几个概念公钥(public-key)、私钥(secret-key)、签名(sign/signature)

  • 公钥私钥是成对
  • 公钥加密,私钥解密。
  • 私钥签名,公钥验证。

新建一个密钥

生成了密钥之后,才能导出公钥、私钥

$ gpg --generate-key

建立的时候,会让你输入密码,别输了之后忘记了,后面gradle插件中会用到。

查看已经生成的密钥

$ gpg -k
---------------------------------
pub   rsa2048 2019-01-25 [SC] [有效至:2021-01-24]
      72963F6B33D962380B1DC4BD8C446B86DF855F85
uid           [ 绝对 ] zhangxiao'paladin2 <mail@zhangxiao.org>
sub   rsa2048 2019-01-25 [E] [有效至:2021-01-24]
  • 72963F6B33D962380B1DC4BD8C446B86DF855F85,这个叫作密钥指纹(应该是用来作惟一识别)
  • 后面8位DF855F85,叫作标识KEY ID,在后面须要加到Gradle插件配置中

导出私钥文件

不少英文文档或文章中常常出现KeyRingFile这个词,这个究竟是啥?

https://users.ece.cmu.edu/~ad...
Keys are stored in encrypted form. PGP stores the keys in two files on your hard disk; one for public keys and one for private keys. These files are called keyrings. As you use PGP, you will typically add the public keys of your recipients to your public keyring. Your private keys are stored on your private keyring. If you lose your private keyring, you will be unable to decrypt any information encrypted to keys on that ring.
$ gpg --export-secret-keys [密钥指纹] > secret.gpg

以上命令就能够生成一个二进制的私钥文件,后面须要配置到gradle中,让插件帮咱们给文件批量签名

加上 -a会生成一个用ASCII 字符封装的 文本文件,方便复制,不过咱们这里不须要

上传公钥到公钥服务器

$ gpg --keyserver keyserver.ubuntu.com --send-keys [密钥指纹]

在sonatype的仓库提交后,会须要一个校验步骤
会须要从多个公钥服务器上下载匹配的公钥,而后来校验你上传的文件的签名

sonatype-gpg-signature-validation

简单的说,你用来签名的私钥和你上传的公钥,必需要一对,这样才能经过校验

如下是sonatype会去拉取的公钥服务器列表

keys.gnupg.net
pool.sks-keyservers.net
keyserver.ubuntu.com
为何我要特地列出来?
由于有些文章或教程里面,都仅给出了一个服务器,如 pool.sks-keyservers.net
可是,我在实际操做有时候由于网络缘由,并非总能成功上传。
因此,若是把公钥上传到 keyserver.ubuntu.com也是OK的。

总结

  1. 密钥的key id
  2. 密钥的password
  3. 私钥的KeyRingFile
  4. 公钥上传到了公钥服务器

准备好了以上几项,咱们就能够开始撸Gradle了

有些文章说,最好是先生成一个吊销凭证备用,暂时不知道什么场景下会用到

四、配置Gradle插件

主要依赖于两个插件:

常规配置

修改build.gradle

// ... 在最下面新增如下代码

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

task sourcesJar(type: Jar) {
    from sourceSets.main.allJava
    classifier = 'sources'
}

task javadocJar(type: Jar) {
    from javadoc
    classifier = 'javadoc'
}


publishing {
    // 定义发布什么
    publications {
        mavenJava(MavenPublication) {
            // groupId = project.group
            // artifactId = project.name
            // version = project.version
            // groupId,artifactId,version,若是不定义,则会按照以上默认值执行
            from components.java
            artifact sourcesJar
            artifact javadocJar
            pom {
                // 构件名称
                // 区别于artifactId,能够理解为artifactName
                name = 'Paladin2 Common'
                // 构件描述
                description = 'Paladin2 Common library'
                // 构件主页
                url = 'https://paladin2.zhangxiao.org'
                // 许可证名称和地址
                licenses {
                    license {
                        name = 'The Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                // 开发者信息
                developers {
                    developer {
                        name = '听风.Michael'
                        email = 'mail@zhangxiao.org'
                    }
                }
                // 版本控制仓库地址
                scm {
                    url = 'https://github.com/michaelzx/Paladin2'
                    connection = 'scm:git:git://github.com/michaelzx/Paladin2.git'
                    developerConnection = 'scm:git:ssh://git@github.com:michaelzx/Paladin2.git'
                }
            }
        }
    }
    // 定义发布到哪里
    repositories {
        maven {
            url "https://oss.sonatype.org/service/local/staging/deploy/maven2"
            credentials {
                // 这里就是以前在issues.sonatype.org注册的帐号
                username sonatypeUsername
                password sonatypePassword
            }
        }
    }
}

signing {
    sign publishing.publications.mavenJava
}


javadoc {
    // <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    // 防止本地打开中文乱码
    options.addStringOption("charset", "UTF-8")
}

在工程根目录下新增gradle.properties

signing.keyId=密钥keyId
signing.password=密钥password
signing.secretKeyRingFile=私钥keyRingFile路径

sonatypeUsername=sonatype帐号
sonatypePassword=sonatype密码

保护敏感信息

以上方式,基本是按照gradle文档的例子写的。
可是假如你的工程是提交到非私有仓库,那么Sonatype的帐号信息和GPG的信息,就这样暴露的话,彷佛不是那么科学。因此,咱们须要换个方式来加载这些properties。

删除刚才的gradle.properties,新建一个publish.gradle文件,放到一个不会被提交到仓库的位置(记得作好备份)。

ext.'signing.keyId' = '密钥keyId'
ext.'signing.password' = '密钥password'
ext.'signing.secretKeyRingFile' = '私钥keyRingFile路径'

ext.'sonatypeUsername'='sonatype帐号'
ext.'sonatypePassword'='sonatype密码'

build.gradle最上面加上一行:

apply from: 'path/publish.gradle'
为了方便,我是直接放在了工程根目录的 .gradle目录下
apply from: rootDir.canonicalPath + '/.gradle/publish.gradle'

五、提交到Sonatype仓库

首先,用Gradle执行publishToMavenLocal任务,先在本地发布下,看看生成了哪些文件,或还有什么问题

而后,用Gradle执行publish任务,发布到指定的maven仓库

若是没有报错,那么恭喜你,已经成功提交到了sonatype的仓库中

可是提交成功,并不表明发布成功

六、到Sonatype OSS发布

用你以前注册的帐号密码,登陆:https://oss.sonatype.org/

登陆后查看左侧的Build Promotion->Staging Repositories

你的提交,会出如今最下面,至于其余是啥,我也不太清楚😂

sonatype-staging-repository-close

Close

你的提交在未处理前,是open状态,而后点击Close按钮。

一开始不太明白这个 Close是啥意思,后来看了下,主要按照中央仓库的要求来验证下你上传到文件
签名就是其中一个步骤,会去公钥服务器拉取公钥,而后来验证你全部的文件

须要等待一会,等它执行完毕,状态会从open变成closed

若是碰到错误的话,仔细看下 Activity选项卡,执行了什么步骤,那个步骤出现了什么错误,很清晰的

Release

通常状况下,感受若是顺利close后,再次选中点击Release,耐心等待一会,就大功告成了!

能够在侧边栏Artifact Search中搜索下你的groupId,此时应该能看到对应的构件名称和版本了

七、回复Issue

可是很抱歉,到此为止,你的jar包,还不会同步到maven仓库中

你须要在你原先建立issue中,告诉下管理人员,你已经完成了第一次发布

我用我蹩脚的英文,回复以下:

I have already completed the first release.

而后管理人员给我回复了:

Central sync is activated for org.zhangxiao.paladin2. After you successfully release, your component will be published to Central, typically within 10 minutes, though updates to search.maven.org can take up to two hours.

OK,至此,你的构建就会同步到Maven Central Repository了。

八、同步须要多久

可能你会像我同样很着急,啥时候能够用,怎么还搜不到呢~。~
从sonatype同步到中央仓库,的确是须要必定的时间

不过根据个人观察,文件的同步,会早于索引的同步

好比,好比你等了半天,而后 https://search.maven.org/ 上搜一下依然搜不到
那么,你能够去 https://repo1.maven.org/maven2/ 上按照坐标找下,是否能找到你的包

若是能找到,那你就能够开始引用它了

九、新版本更新

只要完成第一个发布,后续就不须要再建立issue了,只要重复5-6步骤能够了。

你能够在groupId范围内发布任意名称的构件

结束语

之前在NPM仓库中发布过本身的东西。相比之下,Maven仓库的发布流程,让人感受严谨不少。

赶忙一块儿在Maven全球中央仓库中,留下你本身专属的印记吧!

必定会让你感受棒棒的^_^

参考文章

https://central.sonatype.org/...

原文地址

https://github.com/michaelzx/...

相关文章
相关标签/搜索