如何发布JAR包到Maven中央仓库
前言
在使用Maven构建项目的时候,你是否也有过这样的思考?
这些Maven依赖都是怎么发布到Maven中央仓库供大家使用的?
借由最近正在做的一个API自动化相关的jar包:
-
api-automation-service
这是一个服务于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,需要注册,注册时注意几个点:
- 密码有一定的要求:必须包含一个大写字母,一个特殊字符,必须至少12位;
-
要记得注册时所填的信息,如Email,Username,Password,因为后续其他地方还要用到;
注册Sonatype账号
3. 注册完成后登录,创建issue;
(1). 可选择直接创建issue,即:Create an issue,或浏览Sonatype后,再使用Create功能创建issue,有使用过Jira同学的应该很熟悉~
登录后
(2). 创建issue时有几个注意点:
- Project:选择Community Support - Open Source Project Repository Hosting (OSSRH)
- Issue Type:选择New Project
4. 填写issue信息;
点击Next按钮后,进入填写issue详情的页面,这里要特别注意一下:
- Summary:填写JAR包名称,如:api-automation-service
- Group Id:个人正常填写com.github.XXX,XXX为github username,如:com.github.dylanz666,这是Sonatype建议的,并且Sonatype会在创建完issue后,要求用户在自己的git hub上创建一个以issue号为仓库名的仓库;
- Project URL:项目站点,如:https://github.com/dylanz666/api-automation-service
-
SCM url:项目源码仓库,如:
https://github.com/dylanz666/api-automation-service.git
其他内容不用填写,创建Issue后需要等待一小段时间,Sonatype的工作人员审核处理,速度还是很快的,一般一个工作日以内,当Issue的Status变为RESOLVED后,就可以进行下一步操作了,工作人员会在issue上指导用户操作。
3). 下载、安装、使用gpg工具
1. 发布JAR包到Maven时需要一个签名过程,这个过程主要是出于安全考虑,使用的具体步骤是:
(1).下载安装
这个过程还是比较简单的,只需要双击执行下载好的.exe文件,傻瓜式安装,啥也不用改,gpg下载地址:https://www.gpg4win.org/download.html
(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即可,如:
(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>
这里有几个要注意的点:
- id要与pom.xml中发布jar节点内使用的id一样,如二者都是ossrh:
<!-- 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>
-
username和password
正常是指sonatype注册时的用户名和密码,但不知道是由于密码没转义还是方式不对,我在发布时一直报401,401就是没权限,一般就是账号密码错误,总之死活没搞定,有知道的朋友麻烦告诉我一下,感恩!
后来我发现另外一个途径获取加密后的用户名和密码,可以成功用于发布:
a. 首先使用sonatype账号密码登录nexus仓库管理站点:https://oss.sonatype.org/#welcome
b. 找到nexus仓库管理站点右上角用户名入口,打开小菜单,点击小菜单内的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,如:
(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按钮;
(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入口查找;
(6). Release完成后,还要等2小时左右,才能在中央仓库中找到,或者才能被其他项目引用;
- 中央仓库地址:https://repo.maven.apache.org/maven2
- 我们可以逐层找到自己的jar,如:https://repo.maven.apache.org/maven2/com/github/dylanz666/api-automation-service/
- Sonatype jar中央仓库搜索站点:https://search.maven.org/
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到中央仓库的整个过程,整个过程总体来说稍微有点复杂,我们体验到了开源贡献者的不容易,加油!
码字不容易,点赞需积极
谢谢!!!