写点什么

手把手教你提交 Jar 包到 Maven 公共仓库 | 萌新写开源 02

作者:Zhendong
  • 2021 年 12 月 14 日
  • 本文字数:5236 字

    阅读完需:约 17 分钟

手把手教你提交Jar包到Maven公共仓库 | 萌新写开源02

在上一篇文章中,我介绍了自己的 SpringBoot Starter 项目,可以让我们使用注解的方式轻松地获取操作日志,并推送到指定数据源。


之前,我的项目开源在 Github 上,大家想要用我的项目,还得把 Github 仓库配置到 Maven 的 Setting.xml 里,一点也不方便。


本文,就整理一下我把项目上传到公共 Maven 仓库的过程,当做一篇教程文章。


不得不说,上传公共 Maven 仓库,还是颇费周折的,差点没把人气死。


《萌新学开源》系列文章持续更新:


《萌新写开源01》如何使用注解优雅的记录操作日志


《萌新写开源 02》如何提交项目到 Maven 公共仓库 (本文)


《萌新写开源》如何从 0 到 1 写一个 SpringBoot Starter


《萌新写开源》如何让你的注解支持重复注解


码字不易,求个关注!公众号:后端技术漫谈 ,全网博客名:蛮三刀酱

总体流程

网上有很多文章可以查到,主要是以下几步:


  • 在 sonatype 提交发布工单(Issue)

  • 配置 gpg 秘钥

  • 配置 pom.xml 和 setting.xml

  • mvn clean deploy


你肯定要问了,sonatype 和公共的 Maven 仓库是什么关系?为什么需要在 sonatype 进行操作呢?


Maven 中央仓库并不支持直接发布 jar 包。我们需要将 jar 包发布到一些指定的第三方 Maven 仓库,然后该仓库再将 jar 包同步到 Maven 中央仓库。其中,最”简单”的方式是通过Sonatype OSSRH仓库来发布 jar 包。接下来,我会介绍如何将 jar 包发布到 Sonatype OSSRH。


此外,还要重申的一点:网络上的教程都是有时效性的,包括本文也是(本文写于 2021 年 12 月)。所以最好的方式,是按照官网的文档去做,遇到问题再配合网上的教程解决,因为官网的文档永远是最新并且最优的解决方案,直接照着博客教程去做有可能会走很多弯路。


官网文档地址:(这是你最应该看的文档没有之一)


https://central.sonatype.org/publish/publish-maven/


好了,让我们一步步跟着上面的官方文档来操作。

在 sonatype 提交工单

第一步,首先你需要在 sonatype 网站注册账号:


https://issues.sonatype.org/secure/Signup!default.jspa



创建好后登录,点击页面上方的新建,来提交一个新的 issue。


下图是我创建时候填写的内容,大家可以参考。



主要是几个地方要注意:


  • 问题名称,只要大概表达清楚意思即可

  • groupId 要写准确

  • Porject URL 填写 Github 仓库地址

  • SCM url 需要在 Github 仓库地址后带 git 后缀


提交后,我本来以为是人工审核,其实是全自动机器人自动回复你。它要求你证明你对 groupId 的网址有 所有权,比如我填写的是 cn.monitor4all,那么我就要在 monitor4all.cn 的网站上,添加一个 TXT 解析,指向这个 Issue(值写为 OSSRH-xxxxx).


如果你是的 groupId 填写的是 com.github.xxx,则不需要做上述的步骤。所以如果自己没有域名,或者嫌麻烦的,直接用 com.github.xxx 即可。



由于我的网站域名是自己买的,并且是腾讯云解析的,所以我去腾讯云添加了一条 TXT 解析值写为 OSSRH-75759。(我的工单地址就是https://issues.sonatype.org/browse/OSSRH-75759



稍等几分钟,sonatype 就检测到了你的域名所有权。

配置 gpg 秘钥

第二部,你需要设置 gpg 秘钥,官网 gps 秘钥签名教程:


https://central.sonatype.org/publish/publish-maven/#gpg-signed-components


你肯定会好奇什么是 GPG,GPG 是一种 RSA 算法的实现。


1991 年,程序员Phil Zimmermann为了避开政府监视,开发了加密软件 PGP。这个软件非常好用,迅速流传开来,成了许多程序员的必备工具。但是,它是商业软件,不能自由使用。所以,自由软件基金会决定,开发一个 PGP 的替代品,取名为 GnuPG。这就是 GPG 的由来。


sonatype 既然允许你上传到公有仓库,肯定要对你这个“人”,进行鉴权。防止其他恶意的人上传 Jar 包。


我们去官网下载 GunPG


https://www.gnupg.org/download/


有各种系统的版本可以下载,我下载了 MacOS 版。


装好后,我们打开 ssh,输入命令:


➜  ~ gpg --generate-key
复制代码


紧接着跟着操作就能生成秘钥,以下是我的生成结果,打了码:


gpg (GnuPG/MacGPG2) 2.2.32; Copyright (C) 2021 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.
注意:使用 “gpg --full-generate-key” 以获得一个全功能的密钥生成对话框。
GnuPG 需要构建用户标识以辨认您的密钥。
真实姓名: xxxxxxx电子邮件地址: xxxxxxx@foxmail.com您选定了此用户标识: “xxxxxxxx <xxxxx@foxmail.com>”
更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? u更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? o我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数发生器有更好的机会获得足够的熵。我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数发生器有更好的机会获得足够的熵。gpg: 密钥 54EC3C8FA3A5B50F 被标记为绝对信任gpg: 目录‘/Users/xxxxxxxxx/.gnupg/openpgp-revocs.d’已创建gpg: 吊销证书已被存储为‘/Users/xxxxxxxxx/.gnupg/openpgp-revocs.d/xxxxxxxxxxxxxxxxxxxxxxxxxxxx.rev’公钥和私钥已经生成并被签名。pub rsa3072 2021-12-06 [SC] [有效至:2023-12-06] 8BDxxxxxxxxxxxxxxxxxxxxxxxxxxxxB50Fuid xxxxxxxx <xxxxxxxx@foxmail.com>sub rsa3072 2021-12-06 [E] [有效至:2023-12-06]
复制代码


秘钥生成好后,需要你把公钥上传到公共服务器供 sonatype 验证。


官网教程里有三个地址可以用:


  • keyserver.ubuntu.com

  • keys.openpgp.org

  • pgp.mit.edu


我按照官网给的办法上传:


➜  ~ gpg --keyserver pgp.mit.edu:11371 --send-keys 8BD96B0EA18E5162B94EA7F754EC3C8FA3A5B50Fgpg: 正在发送密钥 54EC3C8FA3A5B50F 到 pgp.mit.edu:11371gpg: 发送至公钥服务器失败:文件结尾gpg: 发送至公钥服务器失败:文件结尾➜  ~ gpg --keyserver keyserver.ubuntu.com --send-keys 8BD96B0EA18E5162B94EA7F754EC3C8FA3A5B50Fgpg: 正在发送密钥 54EC3C8FA3A5B50F 到 hkp://keyserver.ubuntu.comgpg: 发送至公钥服务器失败:Network is unreachablegpg: 发送至公钥服务器失败:Network is unreachable➜  ~ gpg --keyserver pgp.mit.edu:11371 --send-keys 54EC3C8FA3A5B50Fgpg: 正在发送密钥 54EC3C8FA3A5B50F 到 pgp.mit.edu:11371gpg: 发送至公钥服务器失败:文件结尾gpg: 发送至公钥服务器失败:文件结尾
复制代码


但是,报错了,反复尝试了各种网上教程,依然报错。我以为是我网络的问题,或者是那几个服务器也失效了,反正一遍遍的排查,折腾了一个晚上。


就当快要崩溃时,我无意中发现 gunpg 还是有应用可以打开的,也就是有 GUI 界面,于是我进去看了看,然后在我的秘钥点击右键,有上传的服务器的选项:



这样居然传成功了,真是大无语啊兄弟们。


配置 pom.xml 和 setting.xml

第三步,你需要按照官网的教程,来配置你的 pom.xml 和 setting.xml 文件。大家看到这里已经很累了,我就不按照官网教程那样一步步演示了,直接给你们总结下成功需要添加的配置。


首先是 setting.xml。


你需要添加一个 profile:


<profiles>    <profile>      <id>ossrh</id>      <activation>        <activeByDefault>true</activeByDefault>      </activation>      <properties>        <gpg.executable>gpg2</gpg.executable>        <gpg.passphrase>yzdbwj1993</gpg.passphrase>      </properties>    </profile>  </profiles>
复制代码


还需要一个 server,里面需要填写你的 ossrh 账号密码:


  <servers>    <server>      <id>ossrh</id>      <username>你上面注册的账号</username>      <password>你上面注册的密码</password>    </server>  </servers></settings>
复制代码


setting.xml 配置好了,接下来是你项目的 pom.xml。


首先,你需要申明很多 plugin,以及一个 snapshotRepository,我把所有的都贴在了这里。


<distributionManagement>    <!--  申明打包到Maven公有仓库  -->    <snapshotRepository>        <id>ossrh</id>        <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>    </snapshotRepository></distributionManagement>
<build> <plugins> <plugin> <groupId>org.sonatype.plugins</groupId> <artifactId>nexus-staging-maven-plugin</artifactId> <version>1.6.7</version> <extensions>true</extensions> <configuration> <serverId>ossrh</serverId> <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl> <autoReleaseAfterClose>true</autoReleaseAfterClose> </configuration> </plugin> <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> <configuration> <javadocExecutable>${java.home}/../bin/javadoc</javadocExecutable> </configuration> <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>
复制代码


注意,在 maven-javadoc-plugin 这个插件添加后,最好像上面一样,加上一个官方教程没有提到的:


<configuration>  <javadocExecutable>${java.home}/../bin/javadoc</javadocExecutable></configuration>
复制代码


否则你可能会编译失败,提示找不到你的 JAVA_HOME 环境变量,就像下图这样:


MavenReportException: Error while creating archive: Unable to find javadoc command: The environment variable JAVA_HOME is not correctly set.



之后,你还可以添加上你的一些个人信息:


<licenses>  <license>    <name>The Apache Software License, Version 2.0</name>    <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>    <distribution>actable</distribution>  </license></licenses>
<developers> <developer> <name>xxxxxxxxx Yang</name> <email>xxxxxxxxx@foxmail.com</email> <organization>xxxxxxxxxx</organization> </developer></developers>
<scm> <tag>master</tag> <url>git@github.com:qqxx6661/logRecord.git</url> <connection>git@github.com:qqxx6661/logRecord.git</connection> <developerConnection>git@github.com:qqxx6661/logRecord.git</developerConnection></scm>
复制代码

正式打包发布

最后,一切都准备好了,你可以进行最神圣的一个指令


mvn clean deploy
复制代码


紧接着就上传成功了



你的工单这时候也会更新一条信息:


Central sync is activated for cn.monitor4all. After you successfully release, your component will be available to the public on Central https://repo1.maven.org/maven2/, typically within 30 minutes, though updates to https://search.maven.org can take up to four hours.


你的 Jar 包会在 30 分钟左右能够被拉取。


下图就是成功的截图拉。



后记

不知道看完文章,你觉不觉得麻烦呢?其实我自己看一遍写的文字,感觉步骤还是蛮简单的。但自己之前搞不定的时候,还是感觉蛮痛苦的。


希望我走的弯路,能帮大家避开大坑,更快的完成自己项目的上传。


我是目前在阿里搬砖的工程师蛮三刀酱。


持续的创作离不开你的点赞和转发分享!

参考

https://segmentfault.com/a/1190000023781503

发布于: 2 小时前阅读数: 8
用户头像

Zhendong

关注

公众号:后端技术漫谈、蛮三刀酱 2020.07.17 加入

公众号:后端技术漫谈、蛮三刀酱

评论

发布
暂无评论
手把手教你提交Jar包到Maven公共仓库 | 萌新写开源02