最近本身在学习Spring boot的过程当中开发了一个组件 multithreadpool-spring-boot-starter,经过这个组件,咱们能够动态根据配置文件进行多个线程池的初始化。既然有这个产出后,确定是但愿可以上传到maven中央仓库,给更多的人使用,因而就产生了此次项目发布经历。html
整个过程可谓是一波三折,因为平时工做比较忙只能晚上花一个小时搞,因此在经历了近一周的时间后,终于成功发布上去了。java
下面把我当时的上传过程记录下来,但愿帮助更多的朋友。git
1> mac osx 10.14.6 : 本文主要以mac环境为准github
2> Apache Maven 3.2.3 : 本文主要使用maven进行构建和发布例子的说明spring
1> 访问sonatype并注册帐号 https://issues.sonatype.org ,注意要记住帐号密码,会用于咱们后续的发布及相关操做apache
2> 如图新建一个issue,项目须要选择 Community Support - Open Source Project Repository Hosting服务器
3> 参考下图填写概要、Group Id、项目地址、代码管理地址,填写后点击确认提交。网上不少都说须要几个小时或者隔天才有回复,我当时等了10分钟就收到回复了。此时,对方跟你说两件事情:jsp
完成确认并建立和issue同名的项目后,记得要在issue进行回复,具体参考: sonatype-issue 和 Github仓库maven
4> 在经过上述的确认和校验后,sonatype会回复你到时候maven发布会用到的snapshot地址和release地址,并提醒你首次发布后须要回复该issue,详情参考issuespring-boot
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
通常状况下,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>
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>
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 中央仓库遇到的坑: http://www.javashuo.com/article/p-hzksyqvv-kv.html
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