一步一步教你发布构件到Maven中央仓库

概要

相信作为一名合格的Java开发者,一定对Maven有一定的了解,本文不对Maven进行详细描述,关于Maven的更多介绍请移步:http://maven.apache.org/index.html

随着自己做Java开发的时间越来越长,相信每一个开发者或多或少都会有许多总结性的东西,也许你会想把这些东西总结并供别人使用,有一个方式就是将自己的构件发布到Maven中央仓库,这样大家都可以使用了。

本文将一步一步教你如何实现自己的构件发布到Maven中央仓库,我的整个过程是参考了以下博客的内容:
https://my.oschina.net/huangyong/blog/226738?spm=5176.100239.blogcont11826.8.46bKjj
我觉得这个文章写得很好,不过自己实际操作的过程中也会遇到一些问题,这里会陈述我在实践过程中遇到的任何问题并提出怎么解决,以免走太多的弯路。

注:为了撰写本文,我重新找了官方文档,自己也是一步一步跟着文档学着来做,相当于第二次学习了,这也是一种学习过程,本文中间穿插了很多一些细节的过程,可能看起来没那么清晰,后续我会另外写一篇文章来清晰描写每个步骤,算是总结性文档,这个是学习性文档吧,如果有兴趣可联系本人的邮箱:xiajiqiu1990@163.com一起探讨学习的方法,始终认为学会学习比什么都重要。

关于Sonatype

先看看这个官网:http://www.sonatype.org/
首页是这样子的:
这里写图片描述[sonatype 首页]
关于本文,我们只需要关注我上面用红色框框起来的部分,点击进去可以看到:
(注:实际的网址是:http://central.sonatype.org/
这里写图片描述

不过上面的视频都是需要翻墙才能访问的,这个就比较尴尬。
列举几个比较重要的教程地址:

OSSRH Guide: http://central.sonatype.org/pages/ossrh-guide.html
发布要求、规范:http://central.sonatype.org/pages/requirements.html
PGP签名使用:http://central.sonatype.org/pages/working-with-pgp-signatures.html
视频教程:http://central.sonatype.org/articles/2016/Feb/02/free-video-series-easy-publishing-to-the-central-repository/
发布项目文档首页:http://central.sonatype.org/pages/producers.html

注册JIRA帐号

说明

本文不仅仅是要告诉你如何发布自己的构件到中央仓库,还会详细描述我在这个过程中具体怎么做的,当然有些步骤我简化了,实际中我可能遇到更多的阻碍。

关于第一步为什么是注册JIRA帐号,这个不是我凭空造出来的,而是可以通过Snoatype的官网给出的引导文档出来的。

进入发布文档首页

首页地址在前面已经说过了,进入的方式是:
先进入:http://central.sonatype.org/
然后进入页面中的:
这里写图片描述
其中的 Learn how 就是:http://central.sonatype.org/pages/producers.html

正常来说就会去阅读这个文档,全是英文,不要怕,准备好有道词典,要克服自己,不懂的就马上进行翻译,阅读下来最后发现:
这里写图片描述
这其中说明了,有以下一些视频教你怎么简单地实现构件发布到中央仓库,然而这些视频都是Yutube上的,还得翻墙,无奈,可能一下子没有视频可看,发现下面有一句,说的是:
如果想获取更将详细的说明,可以根据他们的一步一步教程做,这可是个好东西,赶紧点进去看看:
具体的链接是:http://central.sonatype.org/pages/ossrh-guide.html

继续啃文档,一开始只是简单的对这个东西说明,后面才是干货,第二小节,初始化设置
这里写图片描述
文档中第一个步骤便是创建一个JIRA帐号

进入创建账号页面

经过上一部的分析,我们知道了第一个步骤就是要创建JIRA帐号,点击连接,进入:
注册页面:https://issues.sonatype.org/secure/Signup!default.jspa
这里写图片描述
这个就没什么好说的了,直接注册就好。
注册完成后就可以登录了

到此,你的 JIRA 项目就算是创建完成了,继续看文档。

创建一个新的项目Issue

紧接着上一步骤:
这里写图片描述
打开这个链接:
https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134
接下来就是重点了:
这里写图片描述
每个表单项我还是简单说下吧:

表单项 说明
Summary 这就是项目说明,你直接可以写个人项目,搞个统称就行
GroupID 看到了吗,下面有一行说明怎么定义groupId的一些建议:http://central.sonatype.org/pages/choosing-your-coordinates.html

比如你喜欢放到github上或者oschina上,你完全可以用类似下面的:
com.github.{username} 比如 com.github.arvin
net.osc.{username} 比如 net.osc.arvin
Project URL
你就填写你的github或者git.oschina.net 的,或者个人主页也行
SCM URL
写成和Project URL 一样也没啥事

等待Issue通过

一般需要 1 ~ 2 天时间,需要耐心等候,审批通过后会发邮件通知,此外,在自己提交的 Issue 下面会看到 Sonatype 工作人员的回复。
这里写图片描述

他会问你是否是你自己的域名,你就恢复这个是你所在组织的域名就行,比如可以这么回复:
Yes,I’m themember of the organization with the domain ‘oschina.net’

回复后看起来就像:
这里写图片描述
然后还是继续等待,可能1~2天,成功后会收到回复:
这里写图片描述

阅读评审需求

在上一步骤中,我们的Issue通过了,我们来继续看看官方文档,再重申一下官方文档的链接如下:
http://central.sonatype.org/pages/ossrh-guide.html

我们继续看看目录:
这里写图片描述
此时应该是走到 Review Requirements 了,即评审要求,我也不知道是什么,先点进去看看吧,具体的文档内容如下:

Review Requirements
There are basic metadata and content requirements for componentsavailable in Central. We recommend getting familiar with them while yourrepositories are being created. For the details, see CentralComponent Requirements.
Helpful videos:
Requirements and Signing Tips
Project Object Model POM?!
Javadoc, Sources and Signing
上面大致就是说,对于中央仓库上的组件使用一定的规范的,你需要在创建你的个人组件(就是你要发布到中央仓库中的组件)之前要熟悉这些规范并且按照要求来。
更加详细的规范可以阅读另外一片文档:
CentralComponent Requirements
链接为:
http://central.sonatype.org/pages/requirements.html

上面还给出了几个视频,然而是需要翻墙滴,而且是英文,不过我们可以直接看文档就行,虽然比较乏味哈哈。
仔细阅读这个文档,你会发现有几个重要的约定要求,下面分别介绍(本人通过阅读英文文档大概总结出来,如果要阅读原汁原味的请自己阅读英文文档哈)

提供Javadoc和Sources

在我们新建组件的时候,必须发布javadoc和sources上去中央仓库,具体命名是通过你在 pom中定义的 groupId,artifactId和version,这个java开发者一般都很熟悉了,不再说明。
最终打包的要求满足以下格式:
artifactId-version-classifier.packaging
其中, artifactId 和 version 就不说了;关于classifier就是对这个包的说明,比如javadoc,或是sources, packaging表示包的形式,比如war、jar等

提供GPG/PGP 的签名文件

All files deployed need to be signed with GPG/PGP and a .asc file containing the signature must be included for each file.E.g. if you deploy the files
example-application-1.4.7.pom
example-application-1.4.7.jar
example-application-1.4.7-sources.jar
example-application-1.4.7-javadoc.jar
you need to include the files
example-application-1.4.7.pom.asc
example-application-1.4.7.jar.asc
example-application-1.4.7-sources.jar.asc
example-application-1.4.7-javadoc.jar.asc
If you need more help setting up and configuring GPG, pleaseread our detailedinstructions.

这个还是很好理解的,就是说你要发布到中央仓库的所有文件都必须经过 GPG或PGP的签名文件,如上面所示,举个例子吧:
这里写图片描述
我们发现,上面这些发布的文件都有一个对应的签名文件,即 .asc 文件

GPG 说明文档

好吧,这GPG到底是什么?上文说要求要GPG签名的文件上传,上面提到如果需要了解 GPG 的更多信息,可以进入一个文档:
http://central.sonatype.org/pages/working-with-pgp-signatures.html

想知道更多就必须进入看看GPG怎么玩,先来看看 GPG 文档使用的第一段怎么说:
One of the requirements for publishing your artifacts to the Central Repository, is thatthey have been signed with PGP. GnuPG or GPG is a freely available implementation of the OpenPGP standard.GPG provides you with the capability to generate a signature, manage keys, andverify signatures. This page documents usage of GPG as it relates to theCentral Repository. In a nutshell you will have to
create your own key pair
and distribute it to a key server so that users can validate it
大概意思就是说,部署组件到中央仓库要求需要GPG签名文件,而GnuPG 或者 GPG 是OpenPGP标准的一个实现,能够管理签名相关的东西,然后这个文档将告诉你如何生成自己的签名Key Pair 密钥对以及分发到 key server 以便别人可以验证签名(最后其实就是在发布的时候,Sonatype会通过key server上的信息进行验证deploy文件的有效性)

安装 GnuPG

根据文档指示,我们需要到网站https://www.gnupg.org/download/
下载相关文件来安装 GnuPG,我们可以看到,上面有两个段落,一个是说源码包,另一个是二进制RELEASE版本,当然我们需要二进制版本,看看如下内容:
这里写图片描述
通常,我们用的比较多的是Windows操作系统,刚好有Windows操作系统的版本,即 Gpg4win,好了,这个就是我们需要的,点进去看看:
具体链接:https://www.gpg4win.org/download.html
这里写图片描述
这个这么大的按钮,忍不住要点下去下载啊,把这个下载下来:
这里写图片描述
剩下的就是自己安装了,我就不说了,作为一个程序猿,你知道怎么安装。

安装完成后我们来验证下:
这里写图片描述
看到这个应该就是完成了安装。

生成 Key Pair 密钥对

一个密钥对允许你对你要发布的组件进行GPG签名和验证,可以通过以下命令来生成新的密钥对:
$ gpg –gen-key
我的生成过程如下:
这里写图片描述
当输入 O 的时候会弹出这个对话框,要求输入密码 passphrase,这个很重要,你一定要记住并且在进行发布的时候是需要用到的。
关于密码,会要求你输入两次,第二次弹出:
这里写图片描述
最终的结果如下:
这里写图片描述
可以看到生成了并放到用户的文件夹下,包含公钥和私钥,最下面那部分就是生成的结果。

查看密钥对

上一步骤中我们生成了密钥对,接下来,我们可以使用以下命令查看本机包含的密钥对:
这里写图片描述
其中,pub表示是公钥,而sub表示私钥。

发布公钥到GPG key-servers

这一步实际上是非常的关键的,Sonatype 公司需要一个公钥来验证你deploy的文件,那么它从哪获取到这个公钥呢?这就需要你部署到key-servers上面去,有哪些key-servers呢?

文档中提供了一个GPG 的key-servers

hkp://pool.sks-keyservers.net
实际上,在我实际的操作中,第一次我deploy的时候,Sonatype在进行验证的时候,说找不到公钥,然后告诉我需要上传到GPG 的key-servers,当时具体的提示信息是:

failureMessage No public key: Key with id: (1fcda02dd63733fe) was not ableto be located on http://pgp.mit.edu:11371/. Uploadyour public key and try the operation again.
failureMessage No public key: Key with id: (1fcda02dd63733fe) was not ableto be located on http://keyserver.ubuntu.com:11371/.Upload your public key and try the operation again.
failureMessage No public key: Key with id: (1fcda02dd63733fe) was not ableto be located on http://pool.sks-keyservers.net:11371/.Upload your public key and try the operation again.

从上面我们发现有三个 key-servers 是 Sonatype公司要用到的,Sonatype公司会在上面任意一个key-servers上进行搜索公钥,具体的key-servers 为:
http://pgp.mit.edu:11371
http://keyserver.ubuntu.com:11371
http://pool.sks-keyservers.net:11371

这个要注意了,这个是带端口的,这个我在实际操作中,也踩了这个坑,一开始我上传公钥到下面中的一个(注意,没有带端口号)

gpg –keyserver hkp://pool.sks-keyservers.net –send-keys C6EED57A
gpg –keyserver hkp://pgp.mit.edu –send-keys C6EED57A
gpg –keyserver hkp://keyserver.ubuntu.com –send-keys C6EED57A

注意了,协议不是http,而是 hkp,要看清楚了,实际上是需要带端口号上传的:

gpg –keyserverhkp://pool.sks-keyservers.net:11371 –send-keys C6EED57A
gpg –keyserverhkp://pgp.mit.edu:11371 –send-keys C6EED57A
gpg –keyserverhkp://keyserver.ubuntu.com:11371 –send-keys C6EED57A

没有成功的话要注意Sonatype反馈了什么信息然后根据信息进行修改。

上面是将公钥发布到 GPG key-servers 的命令,我们可以通过以下命令查看具体的公钥信息:
gpg –keyserverhkp://pool.sks-keyservers.net:11371 –recv-keys C6EED57A
gpg –keyserver hkp://pgp.mit.edu:11371–recv-keys C6EED57A
gpg –keyserverhkp://keyserver.ubuntu.com:11371 –recv-keys C6EED57A

本例中我将我的公钥发布到以下key-servers:
这里写图片描述
查看:
这里写图片描述

使用构建工具进行GPG签名

文档中:http://central.sonatype.org/pages/working-with-pgp-signatures.html#using-build-tools-for-signing

上面介绍了几种构建工具的使用,这里我只简单说下Maven构建工具,其他的请自行参考文档。
这里写图片描述
点击Apache Maven, 进入文档:http://central.sonatype.org/pages/apache-maven.html
这里写图片描述
本次我关注的是 GPG 签名组件,点击进入说明:
http://central.sonatype.org/pages/apache-maven.html#gpg-signed-components

实际上也很简单,只需要在你的pom文件中加入以下gpg签名插件即可:
The Maven GPG plugin is used to sign the components with thefollowing configuration.

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-gpg-plugin</artifactId>
      <version>1.5</version>
      <executions>
        <execution>
          <id>sign-artifacts</id>
          <phase>verify</phase>
          <goals>
            <goal>sign</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

这个插件的版本不止1.5了,可以通过下面这个中央仓库的链接获取最新版本:
https://repo1.maven.org/maven2/org/apache/maven/plugins/maven-gpg-plugin/
这里写图片描述
任意选择一个版本即可。

关于GPG的签名到这里就讲完了,对于我们发布组件到中央仓库已经足够了。

有效的POM元数据

POM文件作为发布组件的一部分,需要你定义一些约定的规范值才能将组件发布上去,本小节就是描述这个规范的。

正确的坐标

项目的坐标,我们又称之为 GAV,即GroupId,ArtifactId,Version三个值,说明如下:
groupId: the top level namespace level for your project starting with the reverse domain name
artifactId: the unique name for your component
version: the version string for your component
文档中提到,关于版本的设定,最好使用语义化的版本管理艺术,具体的请参考:http://semver.org/lang/zh-CN/

一个合法的 GAV 实例如下:

<groupId>com.example.applications</groupId>
<artifactId>example-application</artifactId>
<version>1.4.7</version>

除了 GAV 之外,你还需要在的你项目 POM 文件中指定 packing 值,默认该值就是jar,packing的可选项包括:jar , war ,ear , pom , maven-plugin , ejb , rar , par , aar , apklib等。

项目名称、描述和URL

在你的项目 POM 文件中定义 name、description、url,实例如下:

<name>Example Application</name>
<description>A application used as an example on how to set up pushing 
  its components to the Central Repository.</description>
<url>http://www.example.com/example-application</url>

通常name我们会设置成:

<name>${project.groupId}:${project.artifactId}</name>

License信息

许可协议,你需要在你的jar中定义许可协议,比如:

<licenses>
  <license>
    <name>The Apache License, Version 2.0</name>
    <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
  </license>
</licenses>

<licenses>
  <license>
    <name>MIT License</name>
    <url>http://www.opensource.org/licenses/mit-license.php</url>
  </license>
</licenses>

这个看情况,看你的组件要采用什么许可协议了。

开发者信息

这个需要描述这个项目有哪些开发者:

<developers>
    <developer>
      <name>Manfred Moser</name>
      <email>manfred@sonatype.com</email>
      <organization>Sonatype</organization>
      <organizationUrl>http://www.sonatype.com</organizationUrl>
    </developer>
  </developers>

这个通常写你的Github地址就行,如果你有公司的话就写公司的网址。

SCM信息

这个我就不细说了,直接把英文文档贴出来自己对照写吧:
The connection to your source control system is another requiredelement. The syntax used depends on the version control system used. connection details the read only connection, while developerConnection details read and write access connection details. The url contains the URL for a web front end to your SCM system.
Detailed information is available in the Maven SCM documentation for varioussupported formats and a number of commonexamples follow.
Subversion on your own server:

<scm>
  <connection>scm:svn:http://subversion.example.com/svn/project/trunk/</connection>
  <developerConnection>scm:svn:https://subversion.example.com/svn/project/trunk/</developerConnection>
  <url>http://subversion.example.com/svn/project/trunk/</url>
</scm>

Git hosted on GitHub:

<scm>
  <connection>scm:git:git://github.com/simpligility/ossrh-demo.git</connection>
  <developerConnection>scm:git:ssh://github.com:simpligility/ossrh-demo.git</developerConnection>
  <url>http://github.com/simpligility/ossrh-demo/tree/master</url>
</scm>

Git hosted on BitBucket

<scm>
  <connection>scm:git:git://bitbucket.org/simpligility/ossrh-pipeline-demo.git</connection>
  <developerConnection>scm:git:ssh://bitbucket.org:simpligility/ossrh-pipeline-demo.git</developerConnection>
  <url>https://bitbucket.org/simpligility/ossrh-pipeline-demo/src</url>
</scm>

Mercurial on BitBucket

<scm>
  <connection>scm:hg:http://bitbucket.org/juven/hg-demo</connection>
  <developerConnection>scm:hg:https://bitbucket.org/juven/hg-demo</developerConnection>
  <url>http://bitbucket.org/juven/hg-demo</url>
</scm>

Git on Apache Git Server from Apache Maven

<scm>
  <connection>scm:git:https://git-wip-us.apache.org/repos/asf/maven.git</connection>
  <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/maven.git</developerConnection>
  <url>https://github.com/apache/maven/tree/${project.scm.tag}</url>
  <tag>master</tag>
</scm>

完整的POM实例

地址:https://github.com/simpligility/ossrh-demo/blob/master/pom.xml

首次发布到中央仓库

概要

终于到了这一步,前面做了这么多的铺垫,再来回顾以下我们前面做了哪些事情:
1. 注册JIRA帐号:https://issues.sonatype.org/secure/Signup!default.jspa
2. 新建Issue:https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134
3. 等待Issue通过
4. 编写符合规范的组件项目(主要是根据评审需求编写POM)

先来看看官方文档吧:
Most developers find it easiest to implement a deploymentprocedure in order to automatically meet the component requirements. Dependingon your choice of tools and approach there are many different do this.
Below is information for popular tools and approaches. Feel freeto send notes about alternative approaches or corrections.
Apache Maven
Apache Ant
Gradle
sbt
Manual Staging Bundle Creation and Deployment
Note: There is a limit of roughly 1024MB on any single file uploaded to OSSRH. Your uploadswill fail with a broken pipe exception when you hit this limit. Contact usdirectly if you need to upload larger components.
Helpful videos:
First Deployments
好吧,这个又引导我们去看具体的文档,我使用的是Apache Maven,点击进去:
http://central.sonatype.org/pages/apache-maven.html#deploying-to-ossrh-with-apache-maven-introduction

配置分发管理和认证信息

这一步骤实际上就是要决定你的组件发布到什么地方去,还记得我之前创建了一个新的Issue吗,现在打开那个Issue来,你会发现在Comment后面提供了记得Maven的仓库地址。

用你的帐号密码登录:
https://issues.sonatype.org/secure/Dashboard.jspa
然后在Issue这里找到:
这里写图片描述
这上面就是你之前的那个Issue了,点击打开,拉到后面:
这里写图片描述
下面这个就是一些仓库的地址信息,我贴一份文本的吧:
Configuration has been prepared, now you can:
· Deploy snapshot artifacts into repository https://oss.sonatype.org/content/repositories/snapshots
· Deploy release artifacts into the staging repository https://oss.sonatype.org/service/local/staging/deploy/maven2
· Promote staged artifacts into repository ‘Releases’
· Download snapshot and release artifacts from group https://oss.sonatype.org/content/groups/public
· Download snapshot, release and staged artifacts from staging group https://oss.sonatype.org/content/groups/staging
please comment on this ticket when you promoted your first release, thanks

那么,我们就根据上面的提供的要求,给出以下配置了:

<distributionManagement>
  <snapshotRepository>
    <id>ossrh</id>
    <url>https://oss.sonatype.org/content/repositories/snapshots</url>
  </snapshotRepository>
  <repository>
    <id>ossrh</id>
    <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
  </repository>
</distributionManagement>

此外,你还需要配置一个Nexus Staging Maven plugin

<plugin>
  <groupId>org.sonatype.plugins</groupId>
  <artifactId>nexus-staging-maven-plugin</artifactId>
  <version>1.6.7</version>
  <extensions>true</extensions>
  <configuration>
    <serverId>ossrh</serverId>
    <nexusUrl>https://oss.sonatype.org/</nexusUrl>
    <autoReleaseAfterClose>true</autoReleaseAfterClose>
  </configuration>
</plugin>

注意:这个要用新版本的,你可以直接在maven中央仓库上搜索nexus-staging-maven-plugin,然后使用最新版本的:
https://repo1.maven.org/maven2/org/sonatype/plugins/nexus-staging-maven-plugin/
这里写图片描述

<settings>
  <servers>
    <server>
      <id>ossrh</id>
      <username>your-jira-id</username>
      <password>your-jira-pwd</password>
    </server>
  </servers>
</settings>

注意了注意了,这个的名字要和你pom文件中定义的一样才行,不然maven插件不知道找哪个帐号的。

配置Javadoc和Sources的Maven插件

<!-- Sources Plugin -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-source-plugin</artifactId>
  <version>2.2.1</version>
  <executions>
    <execution>
      <id>attach-sources</id>
      <goals>
        <goal>jar-no-fork</goal>
      </goals>
    </execution>
  </executions>
</plugin>

<!-- Javadoc Plugin -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <version>2.9.1</version>
  <executions>
    <execution>
      <id>attach-javadocs</id>
      <goals>
        <goal>jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>

注意,建议使用最新的版本

GPG 签名插件

<!-- GPG Sign Plugin -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <version>1.5</version>
  <executions>
    <execution>
      <id>sign-artifacts</id>
      <phase>verify</phase>
      <goals>
        <goal>sign</goal>
      </goals>
    </execution>
  </executions>
</plugin>

使用Profiles

在上面的配置中,我其实是建议将这些build相关的配置放到一个Plofiles中的,因为这样可以根据不同环境进行打包发布。
在你的项目的POM文件中配置:

<profiles>
  <profile>
    <id>release</id>
    <build>
      ...
      javadoc, source and gpg plugin from above
      ...
    </build>
  </profile>
</profiles>

POM的实例

提供了两个实例:
https://github.com/simpligility/ossrh-demo/blob/master/pom.xml
https://git.oschina.net/arvin/timeout-cache/blob/master/pom.xml

执行部署命令

如果没有使用profiles的话,直接使用命令:

mvn clean deploy

或者你设置了profiles,指定profiles进行deploy

mvn clean deploy –P release

其中 release是你在profiles中的名称,这个你自己定义一个就好
直接输入这个命令的话会弹出一个对话框,类似:
这里写图片描述
要求你输入密码,这个其实是 gpg 插件弹出来的,在进行私钥加密文件的时候,需要一个密码,需要输入之前创建密钥对的那个密码。

当然,如果你不想弹出这个对话框来的话,也可以直接在命令行中加入

-Dgpg.passphrase=<输入你的密码>

即使用完整的命令如下:

mvn clean deploy

mvn clean deploy –P release –Dgpg.passphrse=xxxxx

实验过程中我的实际执行结果是(注意可能会超时,多试几次就好):
这里写图片描述

从上面可以看到,实际上已经上传到指定的地方去了,复制一个上面的文件路径,打开后发现是:
这里写图片描述
点击 login,然后在打开的页面中右侧有个 Log In, 点击,然后输入你注册的JIRA帐号和密码:
再次打开链接,结果是:
这里写图片描述
说的是还没开始这个 Staging

这是第一次,貌似没那么顺利啊,实际上在文档中有说到:
http://central.sonatype.org/pages/releasing-the-deployment.html
打开这个,按这个操作:
登录后,我点击左侧的:
这里写图片描述
这里写图片描述

选中它,然后有些地方的状态变了,在操作栏上变成:

这里写代码片

这两个按钮就变成可用状态了。
这里写图片描述

点击【Close】按钮,然后等待,时不时你电机系【Refresh】按钮,会把进度显示在下面的【Activity】面板上:
点击【Close】后将弹出一个输入框,其实添加以下说明信息:
这里写图片描述
这个内容没有什么严格要求,随便写下就行了。

好吧,我第一次发布也有错误,看到:
这里写图片描述

上面有说 Sources 验证错误了,点击看看说什么了:
这里写图片描述

说是没有源码jar文件,检查下我的pom文件,发现没有写:maven-source-plugin
在pom的build模块中加入:

<!-- Sources Plugin -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>3.0.1</version>
    <executions>
        <execution>
            <id>attach-sources</id>
            <goals>
                <goal>jar-no-fork</goal>
            </goals>
        </execution>
    </executions>
</plugin>

哈,实际上这个是我自己故意搞的错误,其实就是为了演示以下而已,遇到问题不要怕,仔细阅读后面的失败信息,然后根据具体的信息作调整就可以了。

修改了后,重新执行deploy命令:

mvn clean deploy 

mvn clean deploy –P release –Dgpg.passphrse=xxxxx

注意了,xxx是你的密钥对的密码
执行结果如下:
这里写图片描述
看到了吗,这次能够成功的吧sources包也上传上去了,再次点【Close】
这里写图片描述

此时你是不是迫不及待想去 http://search.maven.org/
上搜索你的组件呢?很遗憾啊,你去搜索的时候是搜不到的,还需要执行一个操作,点击【Refresh】,查看操作栏:
这里写图片描述

按钮状态发生了变化,此时,你需要点击 Release
这里写图片描述
查看Release的状态:
这里写图片描述

此时你又很兴奋的去 http://search.maven.org/ 上面搜索你的组件,然而很遗憾啊,还是不能搜索到,为啥呢?步骤没错啊?好吧,这个时候就要看看官方文档,看看发布的那一章节:
http://central.sonatype.org/pages/releasing-the-deployment.html
其中最后一个步骤:

Closeand Drop or Release Your Staging Repository

After you deployment the repository will be in an Open status. You can evaluate the deployedcomponents in the repository using the Contents tab. If you believe everything iscorrect you, can press the Close button above the list. This willtrigger the evaluations of the components against therequirements.
Closing will fail if your components do not meet therequirements. If this happens, you can press Drop and the staging repository will bedeleted. This allows you to correct any problems with the components and thedeployment process and re-run the deployment. Details are available in the Activitytab below the list by selecting. Press onthe individual steps for further details.
Once you have successfully closed the staging repository, youcan release it by pressing the Release button. This will move the componentsinto the release repository of OSSRH where it will be synced to the CentralRepository.
If you are releasing the first time, do not forget to comment onthe issue tracker ticket, letting us know that you have completed a release sowe can activate your sync process.
Note that deploying with the Nexus Staging Maven plugin or Anttasks will, by default, automatically attempt to close the staging repositoryupon deployment and can be used to release the staging repository from thecommand line as well. This allows you to avoid logging into the OSSRH userinterface altogether. More details can be found in the Maven and Ant sections of this guide.

我们已经操作了 Close 和 Release了,可是为啥没有成功发布了,上面其实有给出了说明:

If you are releasing the first time, do not forget to comment on theissue tracker ticket, letting us know that you have completed a release so wecan activate your sync process.

好吧,这个好麻烦,还要在你之前创建的那个 Issue上进行Comment一下,于是我就进入之前那个 Issue 然后回复了一下:
这里写图片描述
我就简单的回复了:
Hi, thecomponent already uploaded, and release it at the same time

好了,这个时候会很快的收到一个回复:
这里写图片描述
贴个文本清楚一点:
Central sync is activated for net.oschina.arvin. 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.

上面的意思是说,中央仓库已经激活了 net.oschina.arvin 的同步操作,在你成功点击了 Release的时候,你的组件将被发布到中央仓库,一般来说10分钟内可以同步到中央仓库,但要更新到http://search.maven.org/ 使其能搜索到的话还是需要2 小时

什么意思呢?意思就是说10分钟内,别人就可以直接通过在pom中引入你的项目并下载依赖了,但是如果要在http://search.maven.org/ 上搜索到你的组件,还需要等待至少两个小时,因为http://search.maven.org/ 是两个小时刷新一次索引的。

我们可以maven中央仓库中查看自己的组件了:
https://repo1.maven.org/maven2/你的groupId将.变成目录分隔符/artifactId

比如我本次实验所使用的就是:
https://repo1.maven.org/maven2/net/oschina/arvin/thrift-client-support/

感受一下吧:
这里写图片描述
这里写图片描述

至此,我们就完成了组件的发布了。注意第一次才这么麻烦。后面我会继续说明第二次的时候的操作。

此前我发布了一个 timeout-cahce,现在是能够搜索到了:
这里写图片描述

后续发布到中央仓库

首次发布都是比较痛苦的,在上一章节中,我们首次进行发布,实际上遇到很多问题,而且还要Sonatype进行验证。第一次总是比较麻烦的,所谓万事开通难拿,接下来我演示了后续的发布动作,其实并没有那么麻烦了,这个步骤如下。

更新特性、更新版本

通常我们是修改了自己的组件、升级了特性或者修复了BUG之类的才会发布一个新的版本,这里我们为了测试,简单修改了一些内容进行发布,我修改了版本号。

执行发布命令

发布命令和原来的一样,具体是:

mvn clean deploy

mvn clean deploy –P release –Dgpg.passphrse=xxxxx

注意了,xxx是你的密钥对的密码

Close & Release

这个实际上就是Snoatype要求检测你的项目是否符合约定的规则,具体的操作步骤如下:
登录 https://oss.sonatype.org
输入网址https://oss.sonatype.org 然后用你注册的 JIRA帐号密码进行登录,登录后显示如下。

进入Staging Repositories

登录系统后,左侧如下:
这里写图片描述
点击 Staging Repositories,右侧将打开 :
这里写图片描述

搜索你的组件

在上图的右侧搜索框中搜索你的groupId就能大致定位到你的组件了:
这里写图片描述

执行 Close

当你选中你的那个组件的时候,在操作栏上就会显示 Close按钮,点击它:
这里写图片描述
输入一些说明即可。

然后就会进行 Close 的具体操作,可以通过点击Refresh来查看进度:
这里写图片描述

执行 Release

Refresh后,如果完成了Close,没有问题的话就会出现Release 按钮,点击该按钮:
这里写图片描述
点击 Refresh 查看Release 的状态:
这里写图片描述

等待大概10分钟

等待10分钟,等Sonatype同步到Maven中央仓库上去,10分钟后,你可以通过以下链接查看是否部署上去了:

https://repo1.maven.org/maven2/net/oschina/arvin/thrift-client-support/0.0.2

说明一下这个链接:
这里写图片描述

好了,等待大概10分钟后,我就立刻可以看到了:
这里写图片描述
看到了吗,这就是我刚才发布的一个版本。

使用Nexus Staging Maven plugin

摘要

在Close & Release 文档中(
http://central.sonatype.org/pages/releasing-the-deployment.html#close-and-drop-or-release-your-staging-repository
),最后面有一段话:

Note thatdeploying with the Nexus Staging Maven plugin or Ant tasks will, by default,automatically attempt to close the staging repository upon deployment and canbe used to release the staging repository from the command line as well. Thisallows you to avoid logging into the OSSRH user interface altogether. Moredetails can be found in the Maven and Ant sections of this guide.

翻译一下,大概意思就说:你可以使用 Nexus Staging Maven 插件来进行你的组件发布,这样就不需要登录 OSSRH 进行界面操作了,减少了发布的复杂度。

注: OSSRH实际上就是https://oss.sonatype.org/

使用该插件发布

文档地址:http://central.sonatype.org/pages/apache-maven.html#nexus-staging-maven-plugin-for-deployment-and-release
标题很明显,就是说你可以使用 Nexus Staging 的Maven 插件实现组件的deploy和release,这样你就不需要去登录 OSSRH 网站点击Close,点击Release了。

使用很简单,在你项目的 POM中加入:

<!-- Nexus Staging Plugin, auto deploy close and release -->
<plugin>
  <groupId>org.sonatype.plugins</groupId>
  <artifactId>nexus-staging-maven-plugin</artifactId>
  <version>1.6.8</version>
  <extensions>true</extensions>
  <configuration>
     <serverId>ossrh</serverId>
     <nexusUrl>https://oss.sonatype.org/</nexusUrl>
     <autoReleaseAfterClose>true</autoReleaseAfterClose>
  </configuration>
</plugin>

有几个属性需要说明一下:

<!-- 这个要求你在你的settings.xml中的servers中设置了这个ID的用户名和密码,实际上这个用户名和密码就是用来登录 OSSRH 网站的。 -->
<serverId>ossrh</serverId>
<!-- OSSRH网站的地址 --> 
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<!-- 在Staging关闭后是否自动Release,如不是自动,就需要手动,你可以登录OSSRH去手动点击Release也可以自己本地执行命令:
mvn nexus-staging:release
当然也可以删除:
mvn nexus-staging:drop -->
<autoReleaseAfterClose>true</autoReleaseAfterClose>

这个插件有很多命令,比如:
这里写图片描述

执行发布命令

发布命令和原来的一样,具体是:

mvn clean deploy

mvn clean deploy –P release –Dgpg.passphrse=xxxxx

注意了,xxx是你的密钥对的密码

然后就是等待了,看看控制台的输入情况:
这里写图片描述

这个说明,正在使用 nexus staging 插件进行发布
这里写图片描述
插件远程创建了一个 staging repository,然后将本地的打包文件上传到上面去了。
这里写图片描述
上传完成后,插件执行了 Close的操作,Close了这个Staging,以便后续执行Release:
这里写图片描述
接下来就是执行了Release操作,日志显示已经触发了Release,此时就需要等待10分钟左右才能在maven中央仓库中看到了。

等待大概10分钟

等待10分钟,等Sonatype同步到Maven中央仓库上去,10分钟后,你可以通过以下链接查看是否部署上去了:

https://repo1.maven.org/maven2/net/oschina/arvin/thrift-client-support/0.0.3

说明一下这个链接:
这里写图片描述

好了,等待大概10分钟后,我就立刻可以看到了:
这里写图片描述
看到了吗,这就是我刚才发布的一个版本。

实验项目的URL

http://git.oschina.net/arvin/thrift-client-support
http://git.oschina.net/arvin/timeout-cache

联系作者

邮箱:xiajiqiu1990@163.com或 gd_xiajiqiu@163.com
QQ: 673962025
GIT主页:http://git.oschina.net/arvin

没有更多推荐了,返回首页