如何发布JAR包到Maven中央仓库

2020-08-14  本文已影响0人  狄仁杰666

前言

在使用Maven构建项目的时候,你是否也有过这样的思考?

这些Maven依赖都是怎么发布到Maven中央仓库供大家使用的?

借由最近正在做的一个API自动化相关的jar包:

这是一个服务于API自动化的服务,它基于Spring Boot,封装了我日常API自动化工作的一些通用类和定制类,如随机数类、日期处理类、JSONObject处理类、JSONArray处理类、TestNg监听类、TestNg断言类(包含添加Allure步骤)、自定义TestNg注解类、文件处理类、Header组装类、测试数据读取类等。
该Jar是我开源API自动化框架、服务的第一步,目前还在做,等我完成整个API自动化框架、服务的开源工作,后续会推出API自动化框架、服务的文章,敬请期待!

接下来我们一起来学学如何发布JAR包到Maven中央仓库!
发布JAR到Maven中央仓库是走工单模式的,也就是说,整个过程就像像在做issue一样,我们用户作为PM给Maven官方提交issue,Maven官方会在issue内根据既定的工单规则指导用户发布JAR包到Maven中央仓库。

整体步骤

1). 创建Git Hub仓库;
2). 创建工单;
3). 下载、安装、使用gpg工具;
4). 修改maven相关配置;
5). 部署JAR暂存至Nexus仓库;
6). 发布JAR至Maven中央仓库;
7). 使用新发布后的JAR;

1). 创建Git Hub仓库

在进行下一步前,我们要先在自己的git hub上先创建好代码仓库,比如我的代码仓库:https://github.com/dylanz666/api-automation-service.git,这是因为创建工单时,需要填写代码仓库相关的信息!

2). 创建工单

如果已经发布过jar,并且groupId没有变化的话,那么不需要再创建工单了,可直接跳到步骤5),工单例子:https://issues.sonatype.org/browse/OSSRH-59878?filter=20651

1). 创建工单(issue)的Sonatype站点:https://issues.sonatype.org/secure/Dashboard.jspa

2. 第一次使用Sonatype,需要注册,注册时注意几个点:

3. 注册完成后登录,创建issue;

(1). 可选择直接创建issue,即:Create an issue,或浏览Sonatype后,再使用Create功能创建issue,有使用过Jira同学的应该很熟悉~


登录后

(2). 创建issue时有几个注意点:

Create an issue

4. 填写issue信息;

点击Next按钮后,进入填写issue详情的页面,这里要特别注意一下:

issue信息

其他内容不用填写,创建Issue后需要等待一小段时间,Sonatype的工作人员审核处理,速度还是很快的,一般一个工作日以内,当Issue的Status变为RESOLVED后,就可以进行下一步操作了,工作人员会在issue上指导用户操作。

3). 下载、安装、使用gpg工具

1. 发布JAR包到Maven时需要一个签名过程,这个过程主要是出于安全考虑,使用的具体步骤是:

(1).下载安装
这个过程还是比较简单的,只需要双击执行下载好的.exe文件,傻瓜式安装,啥也不用改,gpg下载地址:https://www.gpg4win.org/download.html

下载gpg
(2).生成密钥
(1).在电脑cmd窗口执行命令:gpg --gen-key
(2).过程中需要填写名字、邮箱等,其他步骤可以使用默认值。提别注意一个叫Passphase的参数,需要记住,这个相当于是是密钥的明文密码,后续发布过程中进行签名操作的时候会用到。
生成密钥1

(3). 查询密钥是否生成:gpg --list-keys

查询密钥是否生成

(3).发送公钥
(1). 在cmd中使用命令:gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 0BAB46D8B68FB302370B506B733EF328AE2C2995

发送公钥

(4).查询公钥是否已发送
在cmd中使用命令:gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 0BAB46D8B68FB302370B506B733EF328AE2C2995
像下面这样,即说明公钥发送成功:

查询公钥是否已发送
(顺便说下,该密钥在我发布文章时,已被我删除)

4). 修改maven相关配置

1. 假设jar的主要功能已完成;

2. 修改pom.xml文件;

(1). 修改个人主页url;

<url>https://github.com/dylanz666/api-automation-service</url>

这一步用户设置个人主页,不是必须的,但做了这一步之后,未来发布到中央仓库,当用户搜索到您的jar时,就有一个入口可以直接到您的git hub主页,或您设置的个人主页,如:


个人主页

(2). 修改pom.xml内的配置:

<!--  For pushing jar  -->
    <licenses>
        <license>
            <name>The Apache Software License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
            <distribution>repo</distribution>
        </license>
    </licenses>
    <scm>
        <tag>master</tag>
        <url>https://github.com/dylanz666/api-automation-service.git</url>
        <connection>scm:git:git@github.com:dylanz666/api-automation-service.git</connection>
        <developerConnection>scm:git:git@github.com:dylanz666/api-automation-service.git</developerConnection>
    </scm>
    <developers>
        <developer>
            <name>dylanz</name>
            <email>997604787@qq.com</email>
            <organization>dylanz</organization>
        </developer>
    </developers>
    <!--  For downloading jar  -->
    <repositories>
        <repository>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
        </repository>
    </repositories>
    <!--  For pushing jar  -->
    <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>

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

特别注意,需要添加javadoc支持、gpg使用等,上面的配置是我推荐的写法;

3. 修改settings.xml文件;

(1). 首先如何找到settings.xml文件呢?
使用IDEA可以直接通过IDEA菜单栏File>Settings...>搜索Maven即可,如:

settings.xml

(2). 在settings.xml文件内profiles节点下加入节点:

<profile>
    <id>ossrh</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <gpg.executable>gpg</gpg.executable>
        <gpg.passphrase>XXXX</gpg.passphrase>
    </properties>
</profile>
其中gpg.passphrase的值是步骤:3). 下载、安装、使用gpg工具中提到要记住的Passphase参数值;

(3). 在settings.xml文件内servers节点下加入节点:

<server>
    <id>ossrh</id>
    <username>XXXX</username>
    <password>YYYY</password>
</server>

这里有几个要注意的点:

    <!--  For pushing jar  -->
    <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>
后来我发现另外一个途径获取加密后的用户名和密码,可以成功用于发布:

a. 首先使用sonatype账号密码登录nexus仓库管理站点:https://oss.sonatype.org/#welcome
b. 找到nexus仓库管理站点右上角用户名入口,打开小菜单,点击小菜单内的Profile,进入Profile菜单管理页;

Profile
c. 在Profile菜单管理页顶部选择User Token选项;
选择User Token
d. 点击Access User Token按钮,在弹出框中再次输入用户名密码,然后confirm;
User Token
e. 复制User Token窗口中的整个节点,修改${server}为上述的值,如:ossrh,保存settings.xml文件;

当上述操作都执行完毕,那么准备工作就完成了,接下来准备开始发布到Nexus暂存;

5). 部署JAR暂存至Nexus仓库

1. 当工作人员在issue上告知我们可以开始发布了,如最后一条comment:

可发布comment

其实该条comment对应了pom.xml文件内的配置:

    <!--  For pushing jar  -->
    <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>

并且我们的配置工作都完成了之后,我们就开始执行发布命令了;

2. 发布命令:

(1). 正常情况下,值需要在cmd窗口执行命令:

#跑测试
mvn clean deploy

#不跑测试:
mvn clean deploy -Dmaven.test.skip=true

(2). 如果遇到SSL证书问题,如:


SSL证书问题

我们要忽略SSL证书问题,可参考我之前写的文章:

Maven之SSL证书错误

(3). 命令执行过程中,会弹出一个gpg的窗口,输入前面提到的gpg明文密码Passphase,如:

gpg的窗口
(4). Maven显示build成功后,就可以在Nexus暂存仓库中找到你发布的jar了!
Nexus暂存仓库地址:https://oss.sonatype.org/#welcome
为了分享,我再次发布一次给大家看一下,发布命令:
mvn clean deploy -Dmaven.test.skip=true -Dmaven.multiModuleProjectDirectory=$MAVEN_HOME -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
-Dmaven.wagon.http.ssl.ignore.validity.dates=true
发布成功
Nexus暂存
这个过程不需要等待,部署完成马上就能在Nexus暂存仓库找到,然而,这时候只是暂存在Nexus上,而没有真正发布到Maven的中央仓库中去,因此在中央仓库中是找不到的!!!

6). 发布JAR至Maven中央仓库

要想在中央仓库能够找到我们的jar,还需要一步Release流程;

(1). 在Nexus暂存仓库中找到我们的jar,选中jar,点击jar上方的Close按钮;

Close
(2). 在弹出的Close Confirmation窗口随便填写一些信息,然后点击Confirm即可进入预Release流程,如:
Close Confirmation
(3). 这时可以查看底部状态菜单栏的Activity菜单,这里头显示了Close操作在做的动作(其中包括前面提到的javadoc),直到所有动作都完成,jar顶部的Release按钮就会变成可用状态,这个过程大概会耗费2~3分钟,可以刷新查看进度,如:
Close
(4). 点击顶部Release按钮,正式Release;
同样可以在弹出的Release Confirmation窗口随便填写一些信息,然后点击Confirm即可开始正式Release,如:
正式Release
当然在点击Release按钮前,如果想取消本次发布,那么可以点击jar上方的Drop按钮,删除暂存的jar,取消本次Release;

(5). Release过程同样也大概会耗费2~3分钟,可以刷新查看进度;
Release完成后,Nexus暂存区Staging Repositories就找不到暂存的jar了,可以通过Artifact Search入口或Advanced Search入口查找;

Search

(6). Release完成后,还要等2小时左右,才能在中央仓库中找到,或者才能被其他项目引用;

7). 使用新发布后的JAR

(1). 其他项目中,在pom.xml文件或settings.xml指定镜像地址,也可使用国内镜像,pom.xml中的配置如下:

<!--  For downloading jar  -->
<repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
    </repository>
</repositories>

(2). 在pom.xml文件中的dependencies节点下增加节点,如:

<dependency>
  <groupId>com.github.dylanz666</groupId>
  <artifactId>api-automation-service</artifactId>
  <version>1.0.3</version>
</dependency>

(3). cmd窗口使用命令加载新发布的jar包:

mvn clean install

确认发布完成后,我们最好到Sonatype的issue上comment说我们已经Release好了,工作人员会帮我们关掉issue;

到此为止,我们完成了如何发布jar到中央仓库的整个过程,整个过程总体来说稍微有点复杂,我们体验到了开源贡献者的不容易,加油!

码字不容易,点赞需积极

谢谢!!!

上一篇下一篇

猜你喜欢

热点阅读