惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

K
Kaspersky official blog
Engineering at Meta
Engineering at Meta
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
B
Blog RSS Feed
GbyAI
GbyAI
P
Proofpoint News Feed
aimingoo的专栏
aimingoo的专栏
MyScale Blog
MyScale Blog
D
Docker
阮一峰的网络日志
阮一峰的网络日志
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recorded Future
Recorded Future
美团技术团队
The Register - Security
The Register - Security
V
Visual Studio Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
Tailwind CSS Blog
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
The Blog of Author Tim Ferriss
博客园 - 司徒正美
量子位
B
Blog
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
博客园 - 【当耐特】
MongoDB | Blog
MongoDB | Blog
A
About on SuperTechFans
I
InfoQ
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
雷峰网
雷峰网
大猫的无限游戏
大猫的无限游戏
J
Java Code Geeks
L
LangChain Blog
Latest news
Latest news
S
SegmentFault 最新的问题
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Blog — PlanetScale
Blog — PlanetScale
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cisco Talos Blog
Cisco Talos Blog
F
Full Disclosure
C
Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
W
WeLiveSecurity
T
Tenable Blog
T
Tor Project blog

山岳库博

自建虚拟局域网实现文明六稳定联机 追光者 快手面经(二〇二四年五月九日) 一文搞懂伪代码 2023 级新生周赛第二周题解 Swpp Backends 官方文档 Butterfly 友链魔改教程 控制台游戏引擎开发文档 MI——高级合成表模块 人狼羊菜过河详细题解 蓝桥杯 2023 训练四 Java 全解 蓝桥杯 2023 训练三 Java 全解 蓝桥杯 2023 训练二 Java 全解 全自动博客部署方案 小白也能用的 SW 构建插件 MI—电力系统工作原理 MI文档——自动化GUI绘制 给博客添加追番页面 网站加载速度优化方案总结 给博客添加自定义的通知悬浮窗
在 MavenCentral 上发布你的项目
空梦 · 2023-04-17 · via 山岳库博

  MavenCentral 是一个权威的代码中央仓库,JCenter 相当于一个公共的存储空间,不过 JCenter 早就被标记为废弃,而自 2021 年 3 月 31 日后,JCenter 也不再接受任何提交。所以 MavenCentral 和搭建自己的私人服务器就变成了唯二的选择,不过很明显前者的技术难度和维护成本更低,本文将详细介绍如何向 MavenCentral 上传自己的项目。

本文中提到的所有有关账户、密码、密钥的信息均不要上传到网上!!!
本文中提到的所有有关账户、密码、密钥的信息均不要上传到网上!!!
本文中提到的所有有关账户、密码、密钥的信息均不要上传到网上!!!

Sonatype

  首先我们需要在 Sonatype 上创建一个工单,再次之前,我们需要拥有一个 Sonatype 账户。

注册

  如果你已经有 Sonatype 账户了的话,可以直接跳过本小结。

  我们可以在这个地方注册账户,打开页面后,在网页中的栏目中填写相应内容即可:

  • Email - 邮箱地址,请务必填写有效的邮箱地址
  • Full Name - 网名,随意填写
  • Username - 用户名,登陆时使用的名称
  • Password - 密码
  • 最后一个空是填写验证码

  全部填写完成后,就可以点击Sing up注册账户了,如果填写的信息不符合要求,则会通过红色的文字进行提示,按照提示进行更改即可。

  下一个页面会让你选择语言,选择任何语言均可,这里我选择了中文。

创建工单

  接下来就需要创建工单了,点击上方菜单中的“新建”按钮,然后在弹出的窗体中填写相应信息:

  其余项保持默认即可,如果需要修改按输入框下方的提示修改即可。

  这里我们详细说明一下Group Id,这个包路径并不是指你的项目中使用的包路径,而是你想要将包发布到哪一个 id 下。

  如果你有自己的域名的话可以直接写自己的域名(可以加二级域名,域名倒序填写),比如我填写的是top.kmar.game。如果没有自己的域名那就填 Github 之类的代码仓库的个人地址,格式为:io.github.yourname

  关于Group Id的更多信息可以参考官方文档

  信息填写完备后就可以点击创建按钮了。

  等官方人员审核你的工单后,他们会在你的工单下发布一个评论并修改你的工单状态(工单状态在页面顶部)。

  我收到的评论内容如下:

  评论的大致意思就是需要验证我们对填写的Group Id的所有权,避免私自占用他人的域。

  如果你是使用自己的域名,那么就在 DNS 解析记录中添加一条这样的记录:

1
2
3
记录类型:TXT
记录值:[留空(@)]
记录值:[官方让你填写的 TEXT](我的是:OSSRH-90691)

  如果你是使用的 Github,那就创建一个仓库,仓库名是官方给你的评论中的 URL 中提到的名称,比如说我的就是OSSRH-90691

  操作完毕后将工单状态修改为Open即可,不需要回复官方的评论,工单状态在页面顶部。

  官方审核完毕后会发评论通知,如果没有通过审核,按照回复修正后重新Open工单即可。

  我收到的回复大致内容如下:

  注意上述回复中加粗的域名,这个是我们上传的仓库的地址,如果你收到的回复和我的不一样,以你收到的回复为准。

GPG 密钥

  我们需要使用第三方工具生成 GPG 密钥并上传到服务器,Windows 平台推荐使用Gpg4win,其它平台可以参考网络上的其它教程。

  下载 Gpg4win 并安装后运行,点击“创建个人密钥对”,按照下图内容填写信息:

配置示例

  其中“使用密码句保护生成的密钥”必须勾选,有效期取消,密钥类型可以随意选择,名字和电子邮件地址填写你自己的,其它保持默认即可。

  然后点击OK后在弹出的窗体中填写并重复密码即可完成密钥的创建,创建完毕后会弹出一个窗口,上面写的十六进制字符串就是你的指纹,我们需要保存这个值(没记录也没关系,双击你的证书也可以查看指纹)。

  证书创建完毕后邮件创建的证书,选择“在服务器上发布”,上传过程中没有进度条,耐心等待即可,如果报错说上传失败重试即可。成功后可以点击“在服务器上查找”,在里面搜索你的证书确认是否上传成功。

  然后打开命令提示符,执行以下指令:

1
gpg --export-secret-keys [密钥指纹] > [导出路径,例如:secret.gpg]

  然后将生成的 gpg 文件移动到项目根目录下的某一个目录中(这个文件不要上传到网上!!!),这样,GPG 密钥就创建完了。

Gradle 配置

  接下来我们需要配置 gradle 的相关内容,在gradle.properties中添加如下信息:

   警告:不要将该文件上传到网上,会暴露你的用户密码!!!

1
2
3
4
5
6
ossrhUsername=[Sonatype 用户名]
ossrhPassword=[Sonatype 密码]

signing.keyId=[上面提到的指纹的后 8 位]
signing.password=[设置的密码]
signing.secretKeyRingFile=[证书相对路径(相对于项目根目录),例如:public/secret.gpg]

  然后参照如下代码修改你的gradle.build

如果你的项目是使用 Java 编写的,可以参考下面的代码:

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
plugins {
id 'maven-publish'
id 'signing'
}

group = '......' // 必须和你填写的 Group Id 保持一致
archivesBaseName = 'cg-engine' // 项目的 ID,必须符合后面的要求:仅包含英文小写字母、阿拉伯数字、下划线、分割线且以英文字母开头
version = '1.0-SNAPSHOT' // 项目版本号,开发版以“-SNAPSHOT”结尾,非开发版直接使用数字和小数点

java {
withSourcesJar()
withJavadocJar()
}

publishing {
publications {
mavenJava(MavenPublication) {
from components.java
artifactId archivesBaseName

pom {
name = 'Console Game Engine' // 项目名称
description = 'A console game engine for the JVM.' // 项目简介
url = 'https://github.com/EmptyDreams/ConsoleGameEngine' // 项目主页

scm { // 版本控制的相关信息,参考我填写的内容
url = 'https://github.com/EmptyDreams/ConsoleGameEngine'
connection = 'scm:git:git:github.com/EmptyDreams/ConsoleGameEngine.git'
developerConnection = 'scm:git:ssh://git@github.com:EmptyDreams/ConsoleGameEngine.git'
}

licenses {
license {
name = 'The Affero General Public License, Version 3.0' // 协议名称
url = 'https://www.gnu.org/licenses/agpl-3.0.en.html' // 协议官网
}
}

developers {
developer {
id = 'Kmar' // 作者 id
name = '空梦' // 作者名称
email = 'minedreams@qq.com' // 作者邮箱
}
}
}
}
}

repositories {
maven {
name = archivesBaseName

// 如果 Sonatype 官方人员给你发的域名不是 s01.oss.sonatype,请把域名替换成官方人员告知你的域名
def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl

credentials {
username ossrhUsername
password ossrhPassword
}
}
}
}

signing {
sign publishing.publications.mavenJava
}

如果你的项目是使用 Kotlin 编写的,可以参考下面的代码:

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
plugins {
id 'org.jetbrains.kotlin.jvm' version 'x.x.x'
id 'org.jetbrains.dokka' version 'x.x.x'
id 'maven-publish'
id 'signing'
}

group = 'top.kmar.game'
archivesBaseName = 'cg-engine'
version = '1.2.0'

java {
withSourcesJar()
}

dokkaHtml {
outputDirectory.set(file("build/documentation/html"))
}

tasks.register('dokkaJavadocJar', Jar.class) {
dependsOn(dokkaHtml)
from(dokkaHtml)
archiveClassifier.set("javadoc")
}

publishing {
publications {
mavenJava(MavenPublication) {
from components.java
artifact(tasks["dokkaJavadocJar"])
artifactId archivesBaseName

pom {
name = 'Console Game Engine' // 项目名称
description = 'A console game engine for the JVM.' // 项目描述
url = 'https://github.com/EmptyDreams/ConsoleGameEngine' // 项目主页

scm { // 版本控制的相关信息,参考我填写的内容
url = 'https://github.com/EmptyDreams/ConsoleGameEngine'
connection = 'scm:git:git:github.com/EmptyDreams/ConsoleGameEngine.git'
developerConnection = 'scm:git:ssh://git@github.com:EmptyDreams/ConsoleGameEngine.git'
}

licenses {
license {
name = 'The Affero General Public License, Version 3.0' // 协议名称
url = 'https://www.gnu.org/licenses/agpl-3.0.en.html' // 协议官网
}
}

developers {
developer {
id = 'Kmar' // 作者 id
name = '空梦' // 作者名称
email = 'minedreams@qq.com' // 作者邮箱
}
}
}
}
}

repositories {
maven {
name = archivesBaseName

// 如果 Sonatype 官方人员给你发的域名不是 s01.oss.sonatype,请把域名替换成官方人员告知你的域名
def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl

credentials {
username ossrhUsername
password ossrhPassword
}
}
}
}

signing {
sign publishing.publications.mavenJava
}

  接下来同步一下 Gradle 即可。

发布

  上述步骤都完成后执行 Gradle 指令就可以将项目发布到网上了,publish指令是发布跨平台项目,publishJvmPublicationToMavenRepository指令是发布 JVM 部分。

  指令运行成功后(如果因为网络原因失败可以多试几次,可以不挂梯子)我们还需要登录 Nexus,Nexus 的网址就是上面 Sonatype 官方任意告诉你的域名,比如说我的是:https://s01.oss.sonatype.org/(这个网站不挂梯子也是可以使用的,如果一直访问错误可以尝试挂梯子)。

  进入网站后点击右上角的Login按钮登录,然后点击左侧列表中的Staging Repositories,接下来在中央的区域中点击Refresh按钮,然后你就会看到列表中出现了一个卡片,这个卡片就是你刚刚上传到服务器的项目。

  选中这个卡片,再点击菜单中的Close,描述随意填写即可,然后等待 Sonatype 给你发邮件,收到邮件后再次点击Refresh按钮,选中卡片,点击下方的Activity选项卡即可查看审核信息,如果有审核条目没有通过的话按照要求进行修改即可。

  所有审核条目都通过了的话,菜单中的Release按钮就是可点击的状态,点击Release,描述随意即可。

  如果你是第一次发布软件包,过一会 Sonatype 官方人员会在你的工单下面发布评论,通知你发布成功,等待缓存刷新即可。

  这时候,你就可以在项目依赖管理工具中通过 MavenCentral 加载你的项目了。


创作不易,扫描下方打赏二维码支持一下吧ヾ(≧▽≦*)o