前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何提交自己的项目到Maven公共仓库 | 萌新学开源 02

如何提交自己的项目到Maven公共仓库 | 萌新学开源 02

作者头像
Rude3Knife的公众号
修改2024-01-10 08:05:28
2.2K0
修改2024-01-10 08:05:28
举报
文章被收录于专栏:后端技术漫谈

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

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

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

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

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

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

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

3.《萌新学开源》如何从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,输入命令:

代码语言:javascript
复制
➜  ~ gpg --generate-key

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

代码语言:javascript
复制
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]
      8BDxxxxxxxxxxxxxxxxxxxxxxxxxxxxB50F
uid                      xxxxxxxx <xxxxxxxx@foxmail.com>
sub   rsa3072 2021-12-06 [E] [有效至:2023-12-06]

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

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

  • keyserver.ubuntu.com
  • keys.openpgp.org
  • pgp.mit.edu

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

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

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

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

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

配置pom.xml和setting.xml

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

首先是setting.xml。

你需要添加一个profile:

代码语言:javascript
复制
<profiles>
    <profile>
      <id>ossrh</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <gpg.executable>gpg2</gpg.executable>
        <gpg.passphrase>xxxxxxxx</gpg.passphrase>
      </properties>
    </profile>
  </profiles>

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

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

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

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

代码语言:javascript
复制
<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这个插件添加后,最好像上面一样,加上一个官方教程没有提到的:

代码语言:javascript
复制
<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.

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

代码语言:javascript
复制
<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>

正式打包发布

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

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端技术漫谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总体流程
  • 在sonatype提交工单
  • 配置gpg秘钥
  • 配置pom.xml和setting.xml
  • 正式打包发布
  • 后记
  • 参考
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档