注册 Maven 账号

首先我们需要有一个 Maven 账号用来发布自己的 jar 包,打开 Maven 仓库官网,注册一个账号,这里推荐使用 GitHub 登录,使用 GitHub 登录可以后会自动获得一个命名空间,其余方式则要创建仓库验证,这里用 GitHUb 登录来做演示

命名空间

命名空间用于做项目的唯一标识服,最常见的就是 io.github.xx,相信各位都在 POM 中见过不少 groupId 都是以这种形式开头的。下面我们就需要查看自己的命名空间。

GitHub 登录后,点击右上角的 PublishNamespace 即可看到自己的默认空间,并且是已经经过验证的,我们就用这个命名空间来发布我们的 jar 包。

image-20241219104817157

生成 用户 token

有了命名空间后,我们还需要 用户 token,token 用来部署时的认证,所以要把 token 保管好,不要泄露出去。

点击个人头像,继续点击 View Account,在新页面中,点击 Generate User Token,获得自己的 token。复制好保存在一个地方。

image-20241219105821515

生成的 token 格式如下:

1
2
3
4
5
<server>
<id>你的自定义id</id> <!-- 要和 pom.xml 中的 distributionManagement 的 id 一致 -->
<username>你的用户名</username>
<password>生成的 token</password>
</server>

其中 id 是可以自定义的,这里自定义后要记住,后面在 POM 的 distributionManagement 标签内也会用 id,和这里的 id 要对应。

配置 用户 token 到 maven

将刚刚得到的用户 token 复制到 maven 的 settings.xml 文件内,注意放在 servers 标签内!!

文件加密

在 Maven 仓库发布,必须要用到 GPG 加密,算是一个强制要求,防止包被篡改,同时验证发布者的身份。

下载 GPG

GPG 加密下载,进入网站后,我们下载 GPG 工具

windows:下载 Gpg4win

mac:下载 Mac GPG 或者 直接通过 homebrew 下载,brew install gnupg

linux:通过命令下载:sudo apt-get install gnupg

image-20241219110832603

密钥的生成与发布

下面需要生成密钥,都通过控制台生成就行了,mac 如果选择安装 GOG 程序,会弹出可视化界面,不用管,直接关掉用控制台。windows 注意进入环境下打开 cmd 再操作,具体路径为 {安装位置}/GunPG/bin

开始生成密钥,会让你输入名字、邮箱和密码,名字就输入你的命名空间(例如命名空间为 io.github.soora33,名字就输入 soora33 ),邮箱和密码就自己设置,这里和上一步 Maven 的用户 token 是没有关系的,但要记住,后面部署的时候是要再次输入 GPG 密码的

1
2
3
# 生成密钥
gpg --gen-key
# 输入名字、邮箱、密码

生成完成后,查看自己的密钥 key

1
2
# 查看所有的密钥
gpg --list-keys

uid 就是你自己设置的名字,找到对应的记录,并记录 key,例如我的名字就是 soora33,key 是以 18A 开头的那个。

image-20241219112125940

下面需要将公钥发布到服务器

1
2
3
4
# 将key发布到公钥服务器
gpg --keyserver keyserver.ubuntu.com --send-keys 你的key
# 验证是否发布成功
gpg --keyserver keyserver.ubuntu.com --recv-keys 你的key

如果返回的是这种类型的信息,则表示发布成功

image-20241219112447970

将自己的项目开源

很简单,因为你要发布到 Maven 中央仓库,所以项目需要开源,在 GitHub 上创建仓库并公开就好了。

编写 POM 文件

最后,我们要在 POM 文件中加入我们的一些基本信息,注意,一定要全部配置,否则会上传失败,下面是一个示例,示例中我把 Github 的用户名全部替换为了 username,这个是你对应仓库的 username ,如果不知道自己的 username,就去看自己的仓库 url,仓库名前面的就是 username

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<!-- 基本信息 -->
<groupId>io.github.username</groupId> <!-- 命名空间,必须是你有权限的 -->
<artifactId>your-project</artifactId> <!-- 项目名称 -->
<version>1.0.0</version> <!-- 版本号,不能用 SNAPSHOT -->

<!-- 项目描述信息(必须) -->
<name>项目名称</name>
<description>项目描述</description>
<url>https://github.com/username/your-project</url>

<!-- 许可证信息(必须) 记得替换成你自己项目的开源协议,这里的是 Apache 2.0 协议-->
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>

<!-- 开发者信息(必须) -->
<developers>
<developer>
<name>你的名字</name>
<email>你的邮箱</email>
</developer>
</developers>

<!-- SCM 信息(必须) -->
<scm>
<connection>scm:git:git://github.com/username/your-project.git</connection>
<developerConnection>scm:git:ssh://github.com:username/your-project.git</developerConnection>
<url>https://github.com/username/your-project</url>
</scm>

<!-- 项目依赖…… -->
<dependencies>
</dependencies>

<build>
<plugins>
<!-- central发布插件(必须) -->
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.6.0</version>
<extensions>true</extensions>
<configuration>
<!-- 这里的 id 对应前面 mavem 的用户 token 自定义 id -->
<publishingServerId>你的 用户 token 设置的id</publishingServerId>
<autoPublish>true</autoPublish>
</configuration>
</plugin>

<!-- source源码插件(必须) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.3.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>

<!-- java doc(必须) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.11.2</version>
<!--java8或以上 请加入下面的configuration,防止注释不规范导致报错-->
<configuration>
<doclint>none</doclint>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>

<!-- GPG 签名(必须) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.2.7</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

<distributionManagement>
<snapshotRepository>
<!-- 这里的 id 对应前面 mavem 的用户 token 自定义 id -->
<id>你的 用户 token 设置的id</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<!-- 这里的 id 对应前面 mavem 的用户 token 自定义 id -->
<id>你的 用户 token 设置的id</id>
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>

</project>

发布 jar 包

部署

完成 POM 文件的编写后,我们可以在 IDE 中点击 clean ,再点击 deploy。先将项目先清空旧的打包代码,在重新编译测试打包等一系列操作,最后推送到 maven 的中央仓库

如果没有这个界面,可以直接在项目控制台中输入 mvn clean deploy

image-20241219133256354

推送

如果配置没问题,控制台打印成功日志后,那么你只需要在 maven 仓库页面,点击 Publish,再点击 Deployments,可以看到刚刚打包成功的任务,状态应该是在推送,显示 PUBLISHING,等 10 分钟左右就可以看到状态变为已推送

image-20241219145712479

在官网也已经可以搜索到了

image-20241219133626512

致谢

最后本人是先按照如何发布 jar 包到 maven 中央仓库(2024 年 3 月最新版保姆级教程)这篇教程去走了一遍,成功后,升级插件版本到最新并修改了一些标签语法,修改了 POM 内的一些东西,做了一些改进完成了本篇,这里感谢原作者。