【教程】如何发布maven依赖到中央仓库 gradle

相比于发布到中央仓库,其实有更简单的方法,如 Jitpack,无需域名认证、GPG签名,只需有代码仓库就可,约10分钟就可以完成接入。但本文的重点还是推送至中央仓库。

一、注册Sonatype账号申请创建项目

首先前往 Sonatype 提 issues 来创建一个项目(比较原始),没有账号的先行注册。

创建项目即是创建一个新的 groupId,提交完 issue 后,会有一个经办人要求你在域名下添加一个 TXT 记录,从而验证该域名属于你,添加完后,将 issue 重新打开,经办人验证通过后,这一步就告一段落。

对于很多小项目,不会有特定域的,也支持使用一些托管服务,如 Github,详情见 https://central.sonatype.org/publish/requirements/coordinates/

image.png

添加记录

二、生成 GPG

此步骤用于生成对上传的文件进行签名的秘钥对。

此步骤也按文档操作: https://central.sonatype.org/publish/requirements/gpg/

根据系统,选择合适的安装包,安装 Gnupg Download

执行 gpg --gen-key,按照指引,输入名称、邮箱、密码等信息生成一个key。

查看所生成的 key

1
2
3
4
5
6
7
$ gpg --list-keys
/home/mylocaluser/.gnupg/pubring.kbx
---------------------------------
pub rsa3072 2021-06-23 [SC] [expires: 2023-06-23]
CA925CD6C9E8D064FF05B4728190C4130ABA0F98
uid [ultimate] Central Repo Test <central@example.com>
sub rsa3072 2021-06-23 [E] [expires: 2023-06-23]

向服务器分发我们的公钥

1
gpg --keyserver keyserver.ubuntu.com --send-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98

最后导出私钥到文件中

1
gpg --export-secret-key CA925CD6C9E8D064FF05B4728190C4130ABA0F98  > secret.gpg

至此第二步完成

三、配置 Gradle 推送至仓库

此时已经可以准备推送了,还需配置下 gradle。

我使用 Kotlin 编写 gradle,即 build.gradle.kts 文件。

这里请不要参考 sonatype 的配置或其他博客,因为 gradle 版本千差各异,写法都略有去呗,仅参对应版本的考官方文档,我使用的为 Gradle7.2

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
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
id("maven-publish")
id("signing")
// ...
}


group = "net.peihuan"
version = "0.0.2-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_1_8

repositories {
mavenCentral()
}


dependencies {
// ...
}

tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "1.8"
}
}

tasks.withType<Test> {
useJUnitPlatform()
}

// 去除 jar plain 后缀
tasks.getByName<Jar>("jar") {
enabled = true
archiveClassifier.set("")
}

java {
withSourcesJar()
withJavadocJar()
}


publishing {
publications {
create<MavenPublication>("mavenJava") {
artifactId = "baidu-pan-starter"
from(components["java"])
versionMapping {
usage("java-api") {
fromResolutionOf("runtimeClasspath")
}
usage("java-runtime") {
fromResolutionResult()
}
}
pom {
name.set("peihuanhuan/baidu-pan-starter")
description.set("百度云盘 Java SDK")
url.set("https://github.com/peihuanhuan/baidu-pan-starter")
licenses {
license {
name.set("The Apache License, Version 2.0")
url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
}
}

developers {
developer {
id.set("peihuan")
name.set("peihuan")
email.set("1678167835@qq.com")
}
}
scm {
connection.set("scm:git://github.com/peihuanhuan/baidu-pan-starter.git")
developerConnection.set("scm:git://github.com/peihuanhuan/baidu-pan-starter.git")
url.set("git://github.com/peihuanhuan/baidu-pan-starter.git")
}
}
}
}
repositories {
maven {
val releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
val snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl)

credentials {
username = findProperty("ossrhUsername").toString()
password = findProperty("ossrhPassword").toString()
}
}
}
}

signing {
sign(publishing.publications["mavenJava"])
}

最后需要在 ~/.gradle/gradle.properties 文件中配置 gpg 秘钥以及第一步注册 sonatype 时的用户名、密码,不存在文件就新建。

1
2
3
4
5
6
7
ossrhUsername=xxxxxx 
ossrhPassword=xxxxxxx

# 公钥ID的后80B372361CC1A9AE2452D43FDE8A99FE282B70849
signing.keyId=284F61AF
signing.password=xxxxxxxxxxx
signing.secretKeyRingFile=/your/path/secret.gpg

这里也可以不直接使用用户和密码,建议使用 accessToken 发布,依旧使用一开始创建的用户名、密码来登录 https://s01.oss.sonatype.org ,授权后将获得一组新的用户名密码。

image.png

一切已准备就绪,执行 gradle 中的 publish 方法

image.png

四、发布到中央仓库

如果上一步发布过了一个正式包,那么将在 sonatype 中看见:

image.png

选择该仓库后,先 Close,再 Release 发布,大功告成。

不久后你就会收到邮件:

Central sync is activated for net.peihuan. 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.

30分钟后能同步到中央仓库,4小时才能被搜索到,耐心等待。

参考文档:

https://central.sonatype.org/publish/requirements/gpg/

https://docs.gradle.org/current/userguide/publishing_maven.html

https://help.sonatype.com/repomanager2/configuration/security-setup-with-user-tokens