文档章节

将 Smart 构件发布到 Maven 中央仓库

黄勇
 黄勇
发布于 2014/04/25 22:54
字数 2223
阅读 9031
收藏 175

很多朋友都给我提过同样的建议:

建议把 Smart 的 jar 包放到 Maven 中央仓库吧!放在 OSC Maven 里我下载不到。

需要澄清的是,并不是从 OSC Maven 下载不到 Smart 构件,而是这些构件属于第三方构件,存放在 OSC Maven 的第三方仓库里,所以我们需要在 pom.xml 或 setting.xml 里配置:

<!-- lang: xml -->
<repository>
    <id>osc_thirdparty</id>
    <url>http://maven.oschina.net/content/repositories/thirdparty/</url>
</repository>

然而,很多朋友并不知道需要这样配置,所以就产生了那个建议。

此外,需要注意的是,OSC Maven 的第三方仓库只能存放 RELEASE 构件,而不能存放 SNAPSHOT 构件。

为了让大家能够更方便的使用 Smart,我做了一个慎重的决定:将 Smart 构件发布到 Maven 中央仓库中!

将构件放入中央仓库是一件非常麻烦的事情,需要做很多准备工作,我会尽可能有条理地展现每个步骤,就是为了让大家少走弯路,节省更多的时间,去做更重要的事情。

现在就开始吧!


说到中央仓库,不得不说 Sonatype 这家公司,因为中央仓库就是这家公司砸钱搞的,并且免费向全球所有的 Java 开发者提供构件托管服务,这对于我们而言,简直就是“福利”啊!

Sonatype 官网:http://www.sonatype.org/

对于向我这样的新手而言,第一次将构件发布到中央仓库,真的不是一件非常轻松的事情,所以现在非常有必要把些步骤记下来,这样可以节省大家的时间,做更多重要的事情。

具体的操作步骤如下:

第一步:注册一个 Sonatype 用户

注册地址:https://issues.sonatype.org/secure/Signup!default.jspa

这里的用户名与密码是非常重要的,后面会用到,一定要保存好。

此外,Sonatype 还提供了一个名为 OSS 的系统:

Sonatype OSS:https://oss.sonatype.org

在 OSS 中可以查询到全世界已发布的构件,当然它还有另外一个作用,后面会提到。

第二步:创建一个 Issue

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

此时,相当于提交一个申请。其中,最重要的信息就是 groupId 了,对于这个 groupId,我必要多说几句:

因为我的 Smart 项目源码托管在 OSC Git 上,其域名为 oschina.net,所以 Smart 的 groupId 应该是 net.oschina.huangyong。很明显,这种 groupId 不是我想要的,所以我需要购买一个属于 Smart 的域名。

因为 Smart 是一个开源项目,属于非盈利组织,所以域名后缀应该是 org 的,于是第一反应是想买 smart.org 域名。在 万网 上查询了一下,发现这个域名已经被人买了,没办法,只能换一个域名了。经大家一番讨论后,决定 Smart 的域名为 smart4j.org,在万网上的价格是 139 元/年。经 大漠 的推荐,最后在 GoDaddy 上以 87 元/年的价格购买了该域名,在 GoDaddy 上是可以使用支付宝交易的。

这样一来,Smart 在中央仓库里就可以申请到名为 org.smart4j 的 groupId 了。

第三步:等待 Issue 审批通过

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

第四步:使用 GPG 生成密钥对

如果是 Windows 操作系统,需要下载 Gpg4win 软件来生成密钥对。建议大家下载 Gpg4win-Vanilla 版本,因为它仅包括 GnuPG,这个工具才是我们所需要的。

安装 GPG 软件后,打开命令行窗口,依次做以下操作:

1. 查看是否安装成功

gpg --version

能够显示 GPG 的版本信息,说明安装成功了。

2. 生成密钥对

gpg --gen-key

此时需要输入姓名、邮箱等字段,其它字段可使用默认值,此外,还需要输入一个 Passphase,相当于一个密钥库的密码,一定不要忘了,也不要告诉别人,最好记下来,因为后面会用到。

3. 查看公钥

gpg --list-keys

输出如下信息:

C:/Users/huangyong/AppData/Roaming/gnupg/pubring.gpg
----------------------------------------------------
pub   2048R/82DC852E 2014-04-24
uid                  hy_think <hy_think@163.com>
sub   2048R/3ACA39AF 2014-04-24

可见这里的公钥的 ID 是:82DC852E,很明显是一个 16 进制的数字,马上就会用到。

4. 将公钥发布到 PGP 密钥服务器

gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 82DC852E

此后,可使用本地的私钥来对上传构件进行数字签名,而下载该构件的用户可通过上传的公钥来验证签名,也就是说,大家可以验证这个构件是否由本人上传的,因为有可能该构件被坏人给篡改了。

5. 查询公钥是否发布成功

gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 82DC852E

实际上就是从 key server 上通过公钥 ID 来接收公钥,此外,也可以到 sks-keyservers.net 上通过公钥 ID 去查询。

第五步:修改 Maven 配置文件

需要修改的 Maven 配置文件包括:setting.xml(全局级别)与 pom.xml(项目级别)。

1. setting.xml

<!-- lang: xml -->
<settings>

    ...

    <servers>
        <server>
            <id>oss</id>
            <username>用户名</username>
            <password>密码</password>
        </server>
    </servers>

    ...

</settings>

使用自己注册的 Sonatype 账号的用户名与密码来配置以上 server 信息。

2. pom.xml

<!-- lang: xml -->
<project>

    ...

    <name>smart</name>
    <description>Smart is a lightweight Java Web Framework and reusable components.</description>
    <url>http://www.smart4j.org/</url>

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

    <developers>
        <developer>
            <name>huangyong</name>
            <email>huangyong.java@gmail.com</email>
        </developer>
    </developers>

    <scm>
        <connection>scm:git:git@git.oschina.net:huangyong/smart.git</connection>
        <developerConnection>scm:git:git@git.oschina.net:huangyong/smart.git</developerConnection>
        <url>git@git.oschina.net:huangyong/smart.git</url>
    </scm>

    ...

    <profiles>
        <profile>
            <id>release</id>
            <build>
                <plugins>
                    <!-- Source -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>2.2.1</version>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>jar-no-fork</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <!-- Javadoc -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <version>2.9.1</version>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <!-- GPG -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <version>1.5</version>
                        <executions>
                            <execution>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
            <distributionManagement>
                <snapshotRepository>
                    <id>oss</id>
                    <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
                </snapshotRepository>
                <repository>
                    <id>oss</id>
                    <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
                </repository>
            </distributionManagement>
        </profile>
    </profiles>

    ...

</project>

注意:以上 pom.xml 必须包括:name、description、url、licenses、developers、scm 等基本信息,此外,使用了 Maven 的 profile 功能,只有在 release 的时候,创建源码包、创建文档包、使用 GPG 进行数字签名。此外,snapshotRepository 与 repository 中的 id 一定要与 setting.xml 中 server 的 id 保持一致。

第六步:上传构件到 OSS 中

mvn clean deploy -P release

当执行以上 Maven 命令时,会自动弹出一个对话框,需要输入上面提到的 Passphase,它就是通过 GPG 密钥对的密码,只有自己才知道。随后会看到大量的 upload 信息,而且速度比较慢,经常会 timeout,需要反复尝试。

注意:此时上传的构件并未正式发布到中央仓库中,只是部署到 OSS 中了,下面才是真正的发布。

第七步:在 OSS 中发布构件

在 OSS 中,使用自己的 Sonatype 账号登录后,可在 Staging Repositories 中查看刚才已上传的构件,这些构件目前是放在 Staging 仓库中,可进行模糊查询,快速定位到自己的构件。此时,该构件的状态为 Open,需要勾选它,然后点击 Close 按钮。接下来系统会自动验证该构件是否满足指定要求,当验证完毕后,状态会变为 Closed,最后,点击 Release 按钮来发布该构件。

第八步:通知 Sonatype“构件已成功发布”

需要在曾经创建的 Issue 下面回复一条“构件已成功发布”的评论,这是为了通知 Sonatype 的工作人员为需要发布的构件做审批,发布后会关闭该 Issue。

第九步:等待构件审批通过

没错,还是要等,也许又是 1 ~ 2 天。同样,当审批通过后,将会收到邮件通知。

第十步:从中央仓库中搜索构件

最后,就可以到中央仓库中搜索到自己发布的构件了!

中央仓库搜索网站:http://search.maven.org/

最后,想说一句:第一次都是很痛的,以后就舒服了。没错,只有第一次发布才如此痛苦,以后 deploy 的构件会自动部发布到中央仓库,无需再这样折腾了。


至此,Smart 构件已成功发布到中央仓库,现在可在你的代码中直接配置 Smart 依赖了。

例如:依赖 Smart Framework,你可以这样配置:

<!-- lang: xml -->
<dependency>
    <groupId>org.smart4j</groupId>
    <artifactId>smart-framework</artifactId>
    <version>2.2</version>
</dependency>

最后,感谢 Dead_knight悠悠然然 的经验分享!

Smart 系列博文:http://my.oschina.net/huangyong/blog/158380

参考资料

Choosing your Coordinates

https://docs.sonatype.org/display/Repository/Choosing+your+Coordinates

Sonatype OSS Maven Repository Usage Guide

https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide

How To Generate PGP Signatures With Maven

https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven#HowToGeneratePGPSignaturesWithMaven-MavenGPGPlugin

© 著作权归作者所有

共有 人打赏支持
黄勇

黄勇

粉丝 6389
博文 121
码字总数 216155
作品 1
浦东
CTO(技术副总裁)
私信 提问
加载中

评论(40)

it技术宅男
it技术宅男
请教一下Release 项目的时候报这个错是什么情况Release failed

Nexus returned an error: ERROR 403: Forbidden
小帅帅丶
小帅帅丶
提示401 可我的用户名和密码没错。
是因为在https://issues.sonatype.org issues状态为open吗?
韦博
请问我的项目提交完之后 ,一直是 staging closed 状态,不是release状态。这个怎么处理?
夏天飘过的风
夏天飘过的风
同步到中央库之后,里面有个头像,请问如何设置
g
generallycloud
博主你好,我要上传的项目包含多个子模块,然后我新建一个all in one,子模块的jar,source,javadoc都可以正常生成,但是all in one 里面只生成了jar和source,可以帮忙看下什么原因吗?这是pom文件:https://git.oschina.net/generallycloud/baseio/blob/master/baseio-all/pom.xml?dir=0&filepath=baseio-all%2Fpom.xml&oid=a6a8a1f401dcc3c6670317ff104a33eeab3c6854&sha=46e30c01594b201c7340ff654787e96f1fa24451
monee1988
monee1988
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 29.482 s
[INFO] Finished at: 2016-12-05T16:00:53+08:00
[INFO] Final Memory: 22M/217M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project mybatis-page: Failed to deploy artifacts: Could not transfer artifact ******🏺0.0.1-20161205.080045-1 from/to oss (https://oss.sonatype.org/content/repositories/snapshots/): Access denied to https://oss.sonatype.org/content/repositories/snapshots/**********/0.0.1-SNAPSHOT/**********-0.0.1-20161205.080045-1.jar. Error code 403, Forbidden -> [Help 1]
[ERROR]
亲吻昨日的阳光
亲吻昨日的阳光
支持
狮子的魂
狮子的魂
受教了,感谢分享! 83
黄勇
黄勇

引用来自“silence-try”的评论

求助大神,我执行第六步时[ERROR] Nexus Staging Rules Failure Report
[ERROR] ==================================
[ERROR]
[ERROR] Repository "comgithub9215095360-1024" failures
[ERROR] Rule "signature-staging" failures
[ERROR] * No public key: Key with id: (8e045a578a314258) was not able to be located on <a href=http://keyserver.ubuntu.com:11371>http://keyserver.ubuntu.com:11371</a>. Upload your public key and try the operation again.怎么解决
应该是 公钥 问题,建议重新上传一下。
s
silence-try
求助大神,我执行第六步时[ERROR] Nexus Staging Rules Failure Report
[ERROR] ==================================
[ERROR]
[ERROR] Repository "comgithub9215095360-1024" failures
[ERROR] Rule "signature-staging" failures
[ERROR] * No public key: Key with id: (8e045a578a314258) was not able to be located on <a href=http://keyserver.ubuntu.com:11371>http://keyserver.ubuntu.com:11371</a>. Upload your public key and try the operation again.怎么解决
J2Cache 已经提交到 Maven 中央库

J2Cache 已经提交到 Maven 中央库,现在可以通过 Maven 的方式来使用 J2Cache 用法: J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Redis 。由于...

oschina
2015/01/31
3.1K
15
maven 从入门到实战

1.什么是Maven 我们要开发一个Java 项目,为了保证编译通过, 通常情况下会去寻找jar包,这样很容易造成项目的臃肿, maven提供了很好的项目开发规范与工具, maven 统一管理了jar包,接下来让...

陈小扁
2016/02/25
114
0
Maven详解之仓库------本地仓库、远程仓库

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

liuhao_sh
2015/10/22
82
0
第六章 仓库

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

浣雨笑笑生
2015/09/20
26
0
Maven 私服 Nexus 初识

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

learn_more
2015/06/04
0
1

没有更多内容

加载失败,请刷新页面

加载更多

[LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

描述 设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。 如何反序列化或序列化二叉树是没有限制的,你...

honeymose
56分钟前
5
0
java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
23
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
18
0
my.ini

1

architect刘源源
今天
16
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部