发布 jar 到 Maven中央仓库

背景

和朋友一起维护的开源组织(我就是打个辅助,逃~),其中有一个系列的项目,这些项目统一通过 base 项目的 pom 文件管理这个系列项目依赖的第三方 jar,其他一些辅助项目(如:tools)项目主要是一些常用工具方法的封装,为了能让我们在不同机器,不同地点能够无缝切换,更重要的让使用的伙伴能以最简便的方式运行(避免不必要的配置),我们需要把通用的东西托管起来,那么就需要将这些配置依赖或辅助 jar 托管到 Maven中央仓库,话不多说,就跟着我的步骤来看看如何将 jar 发布到 Maven中央仓库

准备

  • Sonatype 账号
  • GPG
  • 需要发布的项目

这里以 Mac 系统演示

Sonatype

账号注册

Sonatype 账号注册地址:https://issues.sonatype.org/secure/Signup!default.jspa

记录好你的账号和密码,后续会用到

创建 issue

创建 issue 地址:https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134

填写信息时,只填写必填项即可

  1. Summary:简单的项目介绍,填写一下
  2. Group Id:项目ID,用来定位应用 jar 的坐标,可参考官方说明
  3. Project URL:项目主页地址
  4. SCM url:Git仓库地址

注意:

  • Group Id
    • 无自己的域名:可以使用 Github,比如我的 GitHub 用户名是 BladeCode(也可以用你的组织名,如这里:twodragonlake),那么这里的Group Id应该填写 com.github.BladeCode,也可以使用 io.github.BladeCode
    • 有自己的域名:按照要求添加一条 TXT 的 DNS 解析,用来验证你的 Group Id
      ossrh-domain
  • 可参考:OSSRH-45597

验证 Group Id

根据你是否有自己的域名,有不同的方式来验证,上面的创建 issue 的注意中已经说明了,这里不啰嗦了,直接看下图
ossrh-ticket

GPG

  • Windows:Gpg4win
  • macOS:gpg

安装

macOS 为例

1
2
3
4
# 安装
brew install gpg
# 验证
gpg --version

生成秘钥对

1
gpg --gen-key

ossrh-gpg-key

这里用于生成秘钥的用户名和邮箱,可以和你的 Sonatype 账号不一样,记录密码,在部署时需要用到

上传秘钥

1
2
3
4
# 上传秘钥,最好带上端口号
gpg --keyserver hkp://pool.sks-keyservers.net:11371 --send-keys <密钥ID>
# 验证秘钥,最好带上端口号
gpg --keyserver hkp://pool.sks-keyservers.net:11371 --recv-keys <密钥ID>

ossrh-gpg-send

上传到其他服务器,命令同上,更换地址即可

  • hkp://keyserver.ubuntu.com:11371
  • hkp://keys.gnupg.net:11371

如果你忘记了你刚刚生成的秘钥,可以使用下面的命令来查看本地生成的所有秘钥

1
gpg --list-keys

配置

maven 配置

  • 查看路径
    macOS 可以使用 IDEA 查看 maven 的路径,/usr/local/Cellar/maven/3.6.0/libexec/conf
    ossrh-maven-local
  • 修改 settings.xml 文件
    <servers> 标签内,添加如下配置
    1
    2
    3
    4
    5
    <server>
    <id>oss</id>
    <username>你注册的Sonatype账号</username>
    <password>密码</password>
    </server>

pom 配置

配置你需要上传项目的 pom 文件

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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>7</version>
</parent>

<name>tdl-base</name>
<description>TwoDragonLake base pom</description>
<url>https://github.com/TwoDragonLake/tdl-base</url>

<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0</url>
</license>
</licenses>

<developers>
<developer>
<!-- 这里配置 gpg 生成秘钥时的用户名和邮箱 -->
<name>Jerry xu</name>
<email>incoder.xu@gmail.com</email>
</developer>
</developers>
<!-- 更改成你的项目信息 -->
<scm>
<tag>master</tag>
<url>https://github.com/TwoDragonLake/tdl-base.git</url>
<connection>scm:git:https://github.com/TwoDragonLake/tdl-base.git</connection>
<developerConnection>scm:git:https://github.com/TwoDragonLake/tdl-base.git</developerConnection>
</scm>

<profiles>
<profile>
<!-- 这个id有用的,用于发布命令 mvn clean deploy -P release(这个参数) -Dmaven.test.skip=true -->
<id>release</id>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<!-- Source -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Javadoc -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<!-- Skip javadoc error -->
<!-- <configuration>
<failOnError>false</failOnError>
<doclint>none</doclint>
</configuration> -->
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Gpg Signature -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- 这个也是必须要的 以下两个<id>代码块中的id要与 setting.xml中的id一致 -->
<distributionManagement>
<snapshotRepository>
<id>oss</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id>oss</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
</profile>
</profiles>

编译并部署

1
mvn clean deploy -P release -Dmaven.test.skip=true

然后在命令行的弹出中输入使用 gpg 命令生成秘钥时输入的密码,如果在命令行中没有弹框提示,那么可以在终端中输入export GPG_TTY=$(tty)命令,再次执行部署命令,部署完成参考下图提示
ossrh-deploy

发布

编译构建验签

部署成功后,使用Sonatype登录 https://oss.sonatype.org网站,进行发布,在Build Promotion中选择Staging Repositories,然后选择对应你的groud idRepository,进行 close,这里的Close其实就是进行自动构建,进行验证
ossrh-close

参看是自动化运行过程否有错误,正确如下截图没有错误提示,如果有错误提示,就按照提示内容进行处理
ossrh-build

发布

构建成功无错误,后就可以发布了,其实发布和部署是一样的操作,只不过部署是进行Close,而发布是Release操作,此时会提示你发布成功后会删除Staging RepositoriesRepository 记录
ossrh-release

查看

打开你的https://issues.sonatype.org,登录并查看,你的 issues 下,提示你,已经发布成功,稍后可以在https://search.maven.org中搜索到
ossrh-deploy-success

搜索结果,可以查看到我们发布的包
ossrh-search

异常

IDEA 中 not found

项目中引入的 jar,IDEA 中提示无法找到包,可以打开 IDEA 的 Preferences 中进行同步
ossrh-idea-update

本地编译错误

  • 无提示框提示输入密码
    ossrh-local-build-comfrim
    解决方法:export GPG_TTY=$(tty) 命令,重新编译
  • 无法连接sonatype
    ossrh-local-sonatype
    解决方法:查看settings.xml文件中 <server>标签中配置的 id 是否与项目pom文件的<distributionManagement> 标签下的 id 是否一致

sonatype 构建错误

查看构建过程中错误提示,我这里是应为无法验证签名,因此我将提示中的服务器地址,全部都再发布gpg的秘钥,注意地址开头是 hkp
ossrh-build-error

附录

官方

  • OSSRH Guide
  • 发布要求、规范
  • PGP签名使用
  • 发布项目文档

其他

  • 发布 Maven 构件到中央仓库
  • 发布构件到Maven中央仓库
  • 如何发布Jar包到Maven Central Repository