Maven中央仓库发布历程
一、前言
最近自己在学习Spring boot的过程中开发了一个组件 multithreadpool-spring-boot-starter,通过这个组件,我们可以动态根据配置文件进行多个线程池的初始化。既然有这个产出后,肯定是希望能够上传到maven中央仓库,给更多的人使用,于是就产生了这次项目发布经历。
整个过程可谓是一波三折,由于平时工作比较忙只能晚上花一个小时搞,所以在经历了近一周的时间后,终于成功发布上去了。
下面把我当时的上传过程记录下来,希望帮助更多的朋友。
二、环境准备
1> mac osx 10.14.6 : 本文主要以mac环境为准
2> Apache Maven 3.2.3 : 本文主要使用maven进行构建和发布例子的说明
三、步骤说明
1、工单创建
1> 访问sonatype并注册账号 https://issues.sonatype.org ,注意要记住账号密码,会用于我们后续的发布及相关操作
2> 如图新建一个issue,项目需要选择 Community Support - Open Source Project Repository Hosting

3> 参考下图填写概要、Group Id、项目地址、代码管理地址,填写后点击确认提交。网上很多都说需要几个小时或者隔天才有回复,我当时等了10分钟就收到回复了。此时,对方跟你说两件事情:
- 【提醒】确保 group id对应的域名是你的
- 【校验】比如我是的项目地址是github上的,他会要求我在github上创建一个和issue同名的项目确保我拥有该项目的管理权限,
完成确认并创建和issue同名的项目后,记得要在issue进行回复,具体参考: sonatype-issue 和 Github仓库

4> 在通过上述的确认和校验后,sonatype会回复你到时候maven发布会用到的snapshot地址和release地址,并提醒你首次发布后需要回复该issue,详情参考issue
2、gpg 环境安装
gpg的主要作用是生成密钥对,会用于后续我们组件发布的校验。
1> 下载地址:https://www.gnupg.org/download/
2> 如图红色框所示下载并安装

3> 在安装完成后,执行以下命令生成密钥对,按照提示输入账号、邮箱、密码 (PS: 此处的密码在后面发布会用到,请务必记住)
gpg2 --gen-key
4> 执行命令查看密钥, 此时控制台会输出类似下面的内容
$ gpg2 --list-keys
...
pub rsa2048 2019-04-12 [SC] [有效至:2021-04-11]
9A1640F7A2551131612D51B12D83594B7B29D86A
uid [ 绝对 ] xiaoxuetu <xiaoxuetu@163.com>
sub rsa2048 2019-04-12 [E] [有效至:2021-04-11]
5> 执行以下命令将公钥发布到服务器中
$ gpg --keyserver hkp://subkeys.pgp.net --send-keys 9A1640F7A2551131612D51B12D83594B7B29D86A
...
gpg: 正在发送密钥 2D83594B7B29D86A 到 hkp://subkeys.pgp.net
gpg: 发送至公钥服务器失败:Server indicated a failure
gpg: 发送至公钥服务器失败:Server indicated a failure
6> 如果控制台输出如上面类似的错误内容,则将命令中的密钥调整为 2D83594B7B29D86A
$ gpg --keyserver hkp://subkeys.pgp.net --send-keys 2D83594B7B29D86A
gpg: sending key 2D83594B7B29D86A to hkp://pool.sks-keyservers.net
3、Maven全局配置
一般情况下,maven全局配置存在于 ${HOME}/.m2/setting.xml ,如果这个目录下没有,则可以从 ${MAVEN_HOME}/conf/setting.xml 拷贝一份到 ${HOME}/.m2 目录下并进行以下修改
1> 添加服务器验证信息
<server>
<id>sonatype_releases</id>
<username>your user name</username>
<password>your password</password>
</server>
<server>
<id>sonatype_snapshots</id>
<username>your user name</username>
<password>your password</password>
</server>
2> 配置gpg验证命令
<settings>
<profiles>
<profile>
<id>gpg</id>
<properties>
<!-- 由于我电脑安装的是gpg2,不存在gpg命令,所以需要指定执行gpg2,否则会报错 -->
<gpg.executable>gpg2</gpg.executable>
<gpg.passphrase>your password</gpg.passphrase>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>gpg</activeProfile>
</activeProfiles>
</settings>
4、项目maven配置
1> 在项目的pom.xml中,配置相应的开源协议、仓库信息、开发人员信息和发布配置
<!-- 开源签名证书 -->
<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>
<connection>scm:git:git@github.com:xiaoxuetu/multithreadpool-spring-boot-starter.git</connection>
<developerConnection>scm:git:git@github.com:xiaoxuetu/multithreadpool-spring-boot-starter.git
</developerConnection>
<url>http://github.com/xiaoxuetu/multithreadpool-spring-boot-starter/tree/master</url>
</scm> <!-- 开发人员信息 -->
<developers>
<developer>
<name>xiaoxuetu</name>
<email>xiaoxuetu@163.com</email>
<organization>https://github.com/xiaoxuetu</organization>
<timezone>+8</timezone>
</developer>
</developers> <!-- 发布管理信息 -->
<distributionManagement>
<repository>
<!-- 这里的id必须要和全局配置中的release id 一致 -->
<id>sonatype_releases</id>
<name>Nexus Release Repository</name>
<!-- 这里就是在创建issue成功后,对方回复的release发布地址-->
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url>
</repository>
<snapshotRepository>
<!-- 这里的id必须要和全局配置中的snapshot id 一致 -->
<id>sonatype_snapshots</id>
<name>Nexus Snapshot Repository</name>
<!-- 这里就是在创建issue成功后,对方回复的snapshot发布地址-->
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
2> 由于发布到maven中央仓库会要求我们在上传jar到同时,必须同步发布对应到Javadoc、source、asc(利用gpg生成到校验),所以需要在maven中添加以下构建插件
<build>
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<!-- 这里的id必须要和全局配置中的release id 一致 -->
<serverId>sonatype_releases</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<!-- 如果希望发布后自动执行close和release操作,此处可以调整为true -->
<autoReleaseAfterClose>false</autoReleaseAfterClose>
</configuration>
</plugin> <!-- 生成java source.jar -->
<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> <!-- 生成asc 校验文件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<!-- 必须和配置中的gpg校验id一致 -->
<id>gpg</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
5、发布操作
1> 执行以下命令进行发布(如果 pom.xml 中 autoReleaseAfterClose 的值为true,则脚本会自动完成在平台上close、release的操作,至此你将成功发布了,否则我们继续查看第2步)
mvn clean javadoc:jar deploy -P release
2> 登录https://oss.sonatype.org,然后选择staging Repositories

3> 如下图搜索并选择需要发布的组件,依次执行Close、Release操作

4> 如果Release成功,并且你是首次发布组件,则需要到你创建到issue中回复 “我已经成功发布该组件”,经历大概2小时后,该组件将会同步到对应的maven仓库
5> 如果Close或者Release不成功,你可以如下图操作查看原因并谷歌定位,或者回复咨询

四、参考文档
1> 发布构件到 Maven 中央仓库遇到的坑: https://juejin.im/post/5cb03e1a5188251b0e4e3583
2> Working with PGP Signatures: https://central.sonatype.org/pages/working-with-pgp-signatures.html#distributing-your-public-key
3> Deploying to OSSRH with Apache Maven: https://central.sonatype.org/pages/apache-maven.html
Maven中央仓库发布历程的更多相关文章
- 喜大普奔,微软Microsoft JDBC Driver For SQL Server已发布到maven中央仓库
相信通过java和SQLServer开发应用的同学们都经历过如下类似的问题. 微软提供的JDBC官方驱动没有放置在Maven仓库中,这样如果你的Java应用需要访问SQL Server,你不得不下载s ...
- 贡献你的代码,将jar包发布到Maven中央仓库以及常见错误的解决办法
前几天将自己的日志工具发布到了Maven中央仓库中.这个工具本省没有多少技术含量,因为是修改别人的源代码实现的,但是将jar发布到Maven仓库却收获颇丰,因为网上有些教程过时了,在此分享下自己发布j ...
- 如何发布jar包到maven中央仓库
自使用maven以来,没少使用maven中央仓库中的各种jar包,方便有效,但是咱们也不能总是只取不予,也应该懂得奉献,当你写好了一个十分好用的jar包,想贡献出去给大家使用的时候,应该怎么做呢?当然 ...
- 如何将JAR包发布到Maven中央仓库?
将jar包发布到Maven中央仓库(Maven Central Repository),这样所有的Java开发者都可以使用Maven直接导入依赖,例如fundebug-java: <!-- ht ...
- 如何发布自己的 jar 包到 maven 中央仓库(待更新...)
参考链接 如何发布自己的 jar 包到 maven 中央仓库
- Maven系列(十)发布自己的项目到 Maven 中央仓库
Maven 发布自己的项目到 Maven 中央仓库 可能很多人都在用 Maven 仓库,但是如果要问怎么发布项目到中央仓库,估计很多人都不知道了,下面本篇文章带大家往中央仓库发布一个自己的 Maven ...
- 将项目发布到Maven中央仓库的不完整纪要
背景 有几个Utils性质的Jar需要跨项目引用,原本想部署私有Maven仓库,后来感觉太麻烦,索性直接发布到中央库,引用时也方便. 发布成功之后,觉得某些细节还是有必要记录一下. 资源 Sonaty ...
- 如何将自己的代码发布到Maven中央仓库?
去年在公司做工作流相关业务时,当时使用flowable做引擎,中途涉及到一些业务上的需求,自己整理了一些代码,考虑到开源精神,当时就想着将于公司业务无关的代码抽离出来,放到Maven中央仓库中,以供别 ...
- Dev 日志 | 如何将 jar 包发布到 Maven 中央仓库
摘要 Maven 中央仓库并不支持直接上传 jar 包,因此需要将 jar 包发布到一些指定的第三方 Maven 仓库,比如:Sonatype OSSRH 仓库,然后该仓库再将 jar 包同步到 Ma ...
随机推荐
- selenium工作原理详解
selenium简介 Selenium是一个用于Web应用程序自动化测试工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11), ...
- 分析RESTful API安全性及如何采取保护措施
本文中讨论了API安全性和采用安全措施的重要性,如身份验证,API密钥,访问控制和输入验证. API设计的第一步是撰写接口文档 根据TechTarget(海外IT专业媒体)的定义,RESTful AP ...
- SQL Server 2012设置某用户对某些表的记录限制其删除操作
第一步:用sa用户进入SSMS: 第二步:在安全性---用户上面点击右键---"属性": 第三步:在选择页中选择”安全对象“,点击”搜索“,弹出添加对象页面,这里默认为特定对象不用 ...
- java模拟键鼠操作
很久之前百度的,所以忘记了作者,所以仅作为自己的日记纪录在此: package com.robot.test;import java.awt.AWTException;import java.awt. ...
- Java学习笔记——设计模式之七.模板方法模式
模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构图: 代码: 算法骨架 ...
- 学习 GitHub 有什么好处?
layout: post title: "学习 GitHub 有什么好处?" date: 2018-04-15 19:20:20 +0800 --- 鸣谢:王顶 老师(河北经贸大学 ...
- BFS(三):双向广度优先搜索
所谓双向广度搜索指的是搜索沿两个方向同时进行:(1)正向搜索:从初始结点向目标结点方向搜索:(2)逆向搜索:从目标结点向初始结点方向搜索:当两个方向的搜索生成同一子结点时终止此搜索过程. 广度双向搜索 ...
- Filebeat 7.1.1 安装及使用(连接ES)
1. 下载 & 解压 # 下载 wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.1-linux- ...
- 驰骋工作流引擎ccflow-ccbpm工作流引擎sdk表单装载逻辑处理注意事项
cbpm工作流引擎sdk表单装载逻辑处理注意事项 关键字:驰骋工作流引擎 sdk表单 装载接口调用 说明:如果您要采用ccbpm的sdk表单开发,在表单 加载前您需要调用一个接口来获得当前节点的信 ...
- Modbus RTU 通信应用案例
如何打开项目归档文件 例程中的TIA博途项目文件与STEP 7项目文件均为归档文件,需要按如下方式打开: TIA博途项目文件 1. 打开TIA博途软件,通过软件左下方“项目视图”按钮切换至项目视图: ...