发布Jar包到maven中央仓库

什么是maven中央仓库

maven是java世界最流行的构建工具,构建内容囊括了一个java项目的整个生命周期。其中最重要的功能就是依赖管理,maven通过一个类似云的ftp站点统一管理所有java 的jar文件,同时给每个文件的每个版本一个统一的唯一坐标。开发人员通过检索配置这些坐标,选择自己需要的构件搭建自己的项目环境。因此,通过一个叫做pom的描述文件,我们就可以在任何平台搭建好项目运行所需要的环境。方便了协作和分享代码。

而那个类似云的ftp站点就是maven中央仓库。由于一些不可抗拒因素,我们对于中央仓库的访问速度比较慢。因此在平时工作环境中,我们往往都是使用一些镜像站点,如阿里云和开源中国的仓库镜像。同时由于公司里的商业代码不可发布到公开站点,我们也会在局域网内搭建私服。但是无论是镜像还是私服,都像是缓存,虽然提高了下载速度,但是最终,所有的jar都来自中央仓库。因此,如果我们将项目发布到了maven 中央仓库中,那么在所有基于maven或者gradle等的项目里都可以依赖下载你的构件。真正做到了一次发布,处处可用。

发布到中央仓库的好处

首先,作为一个java从业者,对于天天都在用的东西,做一个深入的了解,发布一个项目到中央仓库可以自我满足。作为我来讲,我发布了一个自己的项目,开始有了利用下班时间好好写点开源代码学习和装逼的冲动。

再者,作为一个经验丰富的java开发工程师,我们在日常工作中总会积攒下自己使用得很顺手的一些轮子或者一些通用的基础类。如果我们整理好,并持续维护,发布到了中央仓库之后,就可以避免很多重复性的工作。而且也避免了很多冲突:我现在的公司里,每个项目的dubbo调用接口都会自己定义一个Response和Request类。同一类型的重复定义,跟cpp的多根继承一样烦。这样的结果导致了没法统一处理各个系统的调用返回值。既不够优雅,也显得重复。如果我们把这些基础的东西发布到了中央仓库,就只需要引用一下了。当然这种情况一般是发布到私服比较好,我只是举个例子。具体的大家自行体会。

发布过程

开始步入正题了啊~

注册发布账户

maven中央仓库的发布管理是在一个基于jira的缺陷跟踪平台上进行的。

首先你需要注册一个账户:https://issues.sonatype.org/secure/Dashboard.jspa

img

img

创建工单申请groupId

添加邮箱,用户名,密码,验证码之后登陆账户。

img

之后点击create:

img

带有红色星号的信息为必填。

Summary:你的项目的名称

Description:建议还是写一些比较好

Group Id:com.github.yungyu16(如果有自己的域名,就用自己的倒序域名,如果没有,推荐使用github地址。)

Project URL:在github上复制你的项目的url地址

SCM url:在github上克隆你的项目是用的git地址

最后点击“Create”创建这个Issue,

等待工作人员回应

由于美国时区的缘故,你的工单可能需要一段时间才能得到回应,我大概等了个把小时。工作人员会在issue下添加comment给你提示,当你看到如下图所示时,说明你的groupId已经准备好了。

img

至此,我们可以进行下一步操作了。

配置项目的pom文件

首先第一步是在pom文件里添加 distributionManagement 节点。添加发布的仓库地址,对于发布到中央仓库,此节点的内容是相同的。唯一差别的是仓库id,一般来说都是用release或者oss-release。我使用的是oss-release。可以配置一个用于发布项目的profile节点。如下所示:

<profiles>
        <profile>
            <id>release</id>
            <build>
                <plugins>
                    <!-- Source -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>3.0.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.6</version>
                        <executions>
                            <execution>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
            <distributionManagement>
                <snapshotRepository>
                    <id>oss-snapshots</id>
                    <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
                </snapshotRepository>
                <repository>
                    <id>oss-releases</id>
                    <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
                </repository>
            </distributionManagement>
        </profile>
    </profiles>

同时在你所使用的maven目录的conf/settings.xml 里配置server节点:

        <server>
            <id>oss-releases</id>
            <username>BAadxaxr</username>
            <password>xQMnQNCUmd4uo/xQMnQNCUmd4uo</password>
        </server>
        <server>
            <id>oss-snapshots</id>
            <username>BAadxaxr</username>
            <password>xQMnQNCUmd4uo/xQMnQNCUmd4uo</password>
        </server>

发布时使用命令 mvn clean deploy -Prelease

安装gpg

gpg是GNU开发的开源程序,利用非对称密钥对来进行签名校对。我们需要下载安装对应平台的版本。下载地址:https://www.gnupg.org/download/index.html

img

安装步骤:

img

然后一直下一步就行了,它会自己添加到path路径。

生成密钥对并上传公钥

可参考: https://www.jianshu.com/p/268064e67719

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

生成密钥对

img

私钥密码很关键,要后面需要用到。

查看密钥对

img

我有两对密钥,因为我之前生成了一对,为了演示又生成了一对。

发布密钥

img

密钥服务器有很多台,我们发布到一台之后,他们会进行同步。

发布项目

mvn clean deploy -Prelease

发布过程中会弹框让你填写之前生成密钥对时的密码,填写即可。如果不想每次填写,可以在profile中添加如下元素。

img

注:上图有错误,应该是gpg,而不是gpg2(去他丫的不想换图。。。).

注意: 发布项目时快照版本和release版本会发往不同的仓库,快照版本发布到这个步骤就已经发布成功,可以从中央仓库下载。release版本还需要后续步骤。

关闭和发布仓库暂存区的项目

打开: https://oss.sonatype.org

用注册jira时的用户名和密码登录。

img

点击如图示:

img

在右侧找到自己发布的项目,一般在最后。

img

选中后,先点击close,查看下面的activity查看状态,正常关闭后,再点击release。大概需要几分钟时间。

img

这里可能会出现一种情况,就是在关闭过程中,显示异常,提示说签名校验不通过,这个一般是前面步骤密钥生成和发布时有问题,我遇到了这个情况,怎么都搞不好,然后我就换了台电脑弄了。。。

release显示完成以后,就可以在 http://mvnrepository.com/ 搜索到自己发布的项目啦。。。

发布完成后我们需要去最开始我们创建的那个工单下面备注下,说明我们已经完成了。

img

备注:

  同一个groupId是不需要重复提交工单申请的。也就是说你申请了一个groupId之后,后续的相同groupId的项目直接用你的用户名和密码上传就是了。

  在申请工单里可以注明允许哪些用户名可以上传构件到这个groupId,一般是自己,也可以写上协作者。这样就都可以往按个groupId上传构件了。

最后

最后要说一个坑:

就是在发布过程中,快照版本的发布时很顺利的,一发就成功。但是release版本在发布过程中,到时报错:in maven build it ends with a deployment error : Forbidden

img

我各种折腾了好久,最后还是联系了jira上的工作人员,他们告诉我这是服务端的问题,不是我配置的问题,顺便帮我解决了,于是顺利发布。

img

所以,在过程中有问题的话,积极在最开始创建的工单里添加注释问工作人员。回复还是很快的,我大概等了个把小时。需要注意的是时区问题,所以个把小时算很快啦。

至此,你学会了吗?

参考

将项目发布到 Maven 中央仓库踩过的坑

posted @ 2019-03-22 16:59  Yungyu  阅读(632)  评论(0编辑  收藏  举报