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

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

创建工单申请groupId

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

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

之后点击create:

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

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

Summary:你的项目的名称

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

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

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

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

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

等待工作人员回应

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

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

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

配置项目的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

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

安装步骤:

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

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

生成密钥对并上传公钥

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

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

生成密钥对

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

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

查看密钥对

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

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

发布密钥

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

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

发布项目

mvn clean deploy -Prelease

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

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

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

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

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

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

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

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

点击如图示:

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

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

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

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

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

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

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

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

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

备注:

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

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

最后

最后要说一个坑:

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

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

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

发布Jar包到maven*仓库
什么是maven*仓库
发布到*仓库的好处
发布过程
最后
参考

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

至此,你学会了吗?

参考

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