文档章节

发布构件到Maven中央仓库

 在风中
发布于 2017/08/26 23:52
字数 4168
阅读 353
收藏 3

概要

在我的CSDN一篇文章中,我从一个学习的角度写了一篇博文: http://blog.csdn.net/xiajiqiu/article/details/77607492 该博文记录了我在实际学习过程中的每一个步骤,但是大多数读者是希望有一个清晰的步骤来实现发布构件到Maven中央仓库的,因此我将上一篇博文进行的精简,其实整个步骤大致如下:

  1. 注册JIRA帐号
  2. 创建新的Issue并等待工作人员审核通过(2天左右)
  3. GPG创建密钥对同时上传到key-servers
  4. 编写符合规范的java项目,主要是pom文件规范
  5. 首次发布到中央仓库,需要在原来的Issue上回复等待审核
  6. 后续的发布过程

接下来就上面几个步骤一一介绍。

注册JIRA帐号

注册地址是:https://issues.sonatype.org/secure/Signup!default.jspa 请读者自行进行注册,并记录好自己的帐号和密码,后续会使用到。

创建Issue并等待审核

Issue创建地址: https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134

该链接打开的页面如下: 这里写图片描述

每个表单项我还是简单说下吧:

表单项 说明
Summary 这就是项目说明,你直接可以写个人项目,搞个统称就行
GroupID 看到了吗,下面有一行说明怎么定义groupId的一些建议:http://central.sonatype.org/pages/choosing-your-coordinates.html
Project_URL 你就填写你的github或者git.oschina.net 的,或者个人主页也行
SCM_URL 写成和Project URL 一样也没啥事

创建完成后会进入该Issue界面,通常会立刻收到一个Comment,内容如下: 这里写图片描述

会询问你使用的域名是否是你的或是你的组织,这个你直接说是或者你是这个的成员就行,一般都会通过的。

可能要2天左右的时间才会收到工作人员的回复,如果看到下面这个说明是成功的: 这里写图片描述

GPG密钥对使用

安装Gpg4win

Gpg4win下载地址:https://www.gpg4win.org/download.html 将安装文件下载下来,然后打开DOS进行验证: 这里写图片描述

生成密钥对

一个密钥对允许你对你要发布的组件进行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 able to be located on http://pgp.mit.edu:11371/. Upload your public key and try the operation again.
failureMessage	No public key: Key with id: (1fcda02dd63733fe) was not able to 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 able to 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 --keyserver hkp://pool.sks-keyservers.net:11371 --send-keys C6EED57A gpg --keyserver hkp://pgp.mit.edu:11371 --send-keys C6EED57A gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys C6EED57A

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

上面是将公钥发布到 GPG key-servers 的命令,我们可以通过以下命令查看具体的公钥信息:

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

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

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 required element. 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 various supported formats and a number of common examples 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>

Javadoc & Sources 插件

这两个插件是必须的,在你的项目pom中添加即可:

<!-- 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 签名插件

这个插件是必须的,在你的项目pom中添加即可:

<!-- 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 http://git.oschina.net/arvin/timeout-cache/blob/master/pom.xml

Maven的settings.xml 配置

你需要在你的本机settings.xml 中配置 servers 节点,定义一个ID,并且将你的 JIRA 注册的帐号密码写上去,settings.xml 文件,你可以直接使用Maven安装目录下的/conf/settings.xml

settings.xml文件添加内容:

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

注意了注意了,这个<id></id>的名字要和你pom文件中定义分发的一样才行,不然maven插件不知道找哪个帐号的。 比如上面的是 ossrh,那么你在你的项目中的pom中需要有如下配置:

<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>

看到了吗,这里面的ID和上面那个是一样的,必须是一样的才行。

首次发布到中央仓库

前提

在进行本步骤之前,请确保完成了前面的所有步骤,并准备好了一个完整的有效的java项目。 执行deploy命令 首先,打开命令行,进入到你的项目的目录下,然后执行以下命令:

mvn clean deploy

如果你使用的是Profiles,那么就要指定Profiles执行,比如:

mvn clean deploy –P release

直接输入这个命令的话会弹出一个对话框,类似:

这里写图片描述

要求你输入密码,这个其实是 gpg 插件弹出来的,在进行私钥加密文件的时候,需要一个密码,需要输入之前创建密钥对的那个密码。

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

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

即使用完整的命令如下:

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

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

登录OSSRH并执行Close

登录网站:https://oss.sonatype.org 使用你之前注册的JIRA帐号和密码登录,登录后点击左侧的 Staging Repositories, 右侧面板的右上角有一个搜索框,输入你新建Issue的时候的groupId,然后就能定位到你刚才发布的那个包了: 这里写图片描述

选中它,然后在菜单栏中就有按钮可以使用了,如下图:

这里写图片描述

点击Close,输入描述信息,然后Confirm: 这里写图片描述

点击了Confirm之后,就可以查看进度了:

这里写图片描述

执行Release

在上一步骤中,我们OSSRH,此时在操作栏上的操作项变成了: 这里写图片描述

点击 Release,然后就触发了Release的操作,因为这是第一次,所以其实并没有真正将你的组件同步到maven中央仓库中去,需要执行下一步骤才行。 执行后的结果显示: 这里写图片描述

回复之前创建的Issue

首次Release的时候这个是必须的,登录网站:https://issues.sonatype.org/ 使用你创建的JIRA帐号密码登录后,在Issue出找到你之前新建的那个Issue,然后在Comments下回复说你已经Release了你的组件,类似下面这样子: 这里写图片描述

等待工作人员回复

回复完成后,基本立即刷新页面就会看到工作人员的回复结果了,我这边的结果如下: 这里写图片描述 上面的意思是说,中央仓库已经激活了 net.oschina.arvin 的同步操作,在你成功点击了 Release的时候,你的组件将被发布到 中央仓库,一般来说10分钟内可以同步到中央仓库,但要更新到http://search.maven.org/ 使其能搜索到的话还是需要 2 小时

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

查看自己的组件

工作人员回复后,我们就可以使用自己的组件啦,在maven仓库上输入相应的地址就可以看到自己的组件了:

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

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

感受一下吧:

这里写图片描述

后续发布到中央仓库

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

更新特性、更新版本

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

执行发布命令

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

mvn clean deploy

如果你使用的是Profiles,那么就要指定Profiles执行,比如:

mvn clean deploy –P release

Close & Release

这个实际上就是Snoatype要求检测你的项目是否符合约定的规则,操作和之前的首次发布到中央仓库一样。唯一的区别是,本次不需要在之前的那个Issue上进行回复就能确实的将你的组件发布到Maven中央仓库了。 等待大概10分钟 等待10分钟,等Sonatype同步到Maven中央仓库上去,10分钟后,你可以通过以下链接查看是否部署上去了:

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

说明一下这个链接:

这里写图片描述

好了,等待大概10分钟后,我就立刻可以看到了: 这里写图片描述

看到了吗,这就是我刚才发布的一个版本。

使用Nexus Staging Maven plugin

该插件允许你方便的将组件发布到Maven中央仓库而不需要登录OSSRH网站自己去Close然后又Release,这些功能实际上已经集成到了这个插件上面了。 使用该插件发布 文档地址: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>

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

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

这个插件有很多命令,比如:

这里写图片描述

执行发布命令

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

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.comgd_xiajiqiu@163.com

QQ: 673962025

GIT主页:http://git.oschina.net/arvin

参考文章

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

将 Smart 构件发布到 Maven 中央仓库:https://my.oschina.net/huangyong/blog/226738?spm=5176.100239.blogcont11826.8.46bKjj

© 著作权归作者所有

粉丝 0
博文 1
码字总数 4168
作品 0
广州
私信 提问
加载中

评论(1)

jacker_
jacker_
想问下,jar包发布到maven仓库之后,想删除maven仓库的jar包,怎么操作呢?
第六章 仓库

坐标和依赖是任何一个构件在Maven世界中的逻辑表示方式;而构件的物理表示方式就是文件,Maven通过仓库来统一管理这些文件。   在Maven世界中,任何一个依赖、插件或者项目构建的输出,都可...

浣雨笑笑生
2015/09/20
32
0
Maven详解之仓库------本地仓库、远程仓库

在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。 Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库。(仓库就是存放依赖和插件的地...

liuhao_sh
2015/10/22
122
0
将 Smart 构件发布到 Maven 中央仓库

很多朋友都给我提过同样的建议: 建议把 Smart 的 jar 包放到 Maven 中央仓库吧!放在 OSC Maven 里我下载不到。 需要澄清的是,并不是从 OSC Maven 下载不到 Smart 构件,而是这些构件属于第...

黄勇
2014/04/25
10.2K
42
Maven 私服 Nexus 初识

具体详情可参考链接 http://jingyan.baidu.com/article/preview?eidEnc=fec4bce26b4729f2618d8bc8 1、Nexus仓库分类 Nexus包含了各种类型的仓库类型。在登录后的Nexus界面,单击左边的“Rep...

learn_more
2015/06/04
407
1
Linux搭建Maven私服Nexus3.x环境

一、Maven介绍 Apache Maven是一个创新的软件项目管理和综合工具。 Maven提供了一个基于项目对象模型(POM)文件的新概念来管理项目的构建,可以从一个中心资料片管理项目构建,报告和文件。...

898009427
2018/08/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部