1. 前言
平时写java代码的时候,总会用到依赖库,很方便的一点是,可直接通过maven中央库就能把依赖库导入到自己的项目。
现在考虑自己建造轮子,将自己写的依赖库上传到maven中央库。
2. sonatype账号注册
2.1 sonatype注册
网址:https://issues.sonatype.org/secure/Signup!default.jspa
填写页面信息,这里填写的时候,要想清楚,之后不能再更改的。
username和password是用于登陆网站,并且上传依赖库的时候需要用到。
2.2 Group Id的验证
这里有一系列操作,最终的目的是获得归属于自己的group id。
-
点击邮箱里发来的登陆链接,填写注册时的用户名和密码
-
在主页面面板上创建一个新问题,如下图
项目project | 这里默认选择开源给其他人使用,选open source |
---|---|
问题类型issue type | 选new project |
摘要summary | 随意写一个自己的依赖库简介 |
描述description | 空着,没事,其他非必填项也是一样 |
包名Group Id | 这里注意,我们在IDEA引用他人的依赖库的时候,如下所示,每个人的Group Id是固定,所以写一个自己常用,并且能验证的Group Id(也就是能证明是自己的),也可以使用自己的域名,如果没有那么就是用公共的托管地址,请查看具体的规范。这里我用的是GitHub,因此填写的是io.github.zemise |
项目链接project URL | 这里填写自己的项目地址,比如https://github.com/zemise/Voice-Synthesis |
SCM URL | 填写项目的git url,是带.git后缀的,比如https://github.com/zemise/Voice-Synthesis.git |
- 创建完成后,稍等一会儿,等待管理Bot发来带处理意见的邮件,点击相应链接。我这里附上的是完成后的图,稍微参考下
- 可以看到他有两条意见,因为我用的是GitHub作为公共托管,他要验证那个域名下就是我,所以让我们临时新建一个开源的GitHub项目(空白都行),名字就是本条问题的工单号,如OSSRH-91967。自己创建完成后,意见中的链接能见到项目就行。
- 第二条意见是,设置本问题的状态为open,大概位置就是我红色箭头标注的位置,点下就好。
- 两项注释评论都处理完毕后,等待一会儿,收到congratulation即完成注册。
3. 公钥私钥生成
实际上,之前验证过,没有gpg密钥也能上传依赖库到Maven,但是有一个验证过不了,所以这一步骤还是必要的。
-
安装密钥软件
-
终端命令行生成密钥
# 查看gpg版本
gpg --version
# 生成公钥对,按提示操作
gpg --gen-key
# 结果如下
pub rsa3072 2023-06-08 [SC] [有效至:2025-06-07]
XXXXXXXXXXXXXXXXX示例XXXXXXXXXXXXXXXXXXXX
uid zemise <example@qq.com>
sub rsa3072 2023-06-08 [E] [有效至:2025-06-07]
# 查看生成的密钥对
gpg --list-keys --keyid-format short
# 结果如下
pub rsa3072/63A65AED 2023-06-08 [SC] [有效至:2025-06-07]
XXXXXXXXXXXXXXXXX示例XXXXXXXXXXXXXXXXXXXX
uid [ 绝对 ] zemise <example@qq.com>
sub rsa3072/D32C9D61 2023-06-08 [E] [有效至:2025-06-07]
其中斜杠后的字符编号,如63A65AED,即为公钥编号,后面需要用到
- 导出私钥
# 会在你当前目录生成一个secring.gpg
gpg --export-secret-keys -o secring.gpg
- 同步公钥到公网
gpg2 --keyserver hkp://keyserver.ubuntu.com --send-keys 63A65AED
# 结果如下
gpg: 正在发送密钥 XX示例XX63A65AED 到 hkp://keyserver.ubuntu.com
注意63A65AED为上面得到的编号
完成后,别人需要用公钥去验证是你的签名
4. 上传私人依赖库
这一部分内容,详见《Gradle入门至进阶记录》里的,publishing 项目发布。
这里只简单实现,不做过多解释。
下方主要是以build.gradle和gradle.properties两个文件配置,对于多模块的项目会更加方便,以及复用。简单项目其实也可以单个build.gradle文件全部填写完。
4.1 配置build.gradle
plugins {
id 'java-library'
// 引入发布插件
id 'maven-publish'
// 验证插件,只有上传Maven中央库时需要,私人或者本地库不需要
id 'signing'
}
repositories {
maven {
url 'https://maven.aliyun.com/repository/public'
}
mavenLocal()
mavenCentral()
}
dependencies {
implementation 'org.projectlombok:lombok:1.18.26'
annotationProcessor 'org.projectlombok:lombok:1.18.26'
implementation 'ch.qos.logback:logback-classic:1.4.6'
implementation 'ch.qos.logback:logback-core:1.4.6'
implementation 'com.squareup.okhttp3:okhttp:4.11.0'
implementation 'org.java-websocket:Java-WebSocket:1.3.8'
implementation 'com.google.code.gson:gson:2.8.9'
}
group = 'io.github.zemise'
version = '1.0.0'
// 带源码和javadoc的发布:需要'java-library'插件支持:它是java的升级版,java插件的功能java-library都有
// 生成javadoc前,要确保代码注释方面都按规范写好
javadoc.options.encoding="UTF-8"
java {
withJavadocJar()
withSourcesJar()
}
publishing {
publications {
mavenJava(MavenPublication) {
// 项目名称
artifactId = 'Voice-Synthesis'
from components.java
pom {
name = "Voice-Synthesis(项目名称)"
description = "调用讯飞语音合成API(项目描述)"
url = "https://github.com/zemise/Voice-Synthesis"
licenses {
license {
name = "The Apache License, Version 2.0"
url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
}
}
developers {
developer {
id = 'zemise'
name = 'zemise'
email = 'example@qq.com'
}
}
scm {
connection= "scm:git:https://github.com/zemise/Voice-Synthesis.git"
developerConnection="scm:git:https://github.com/zemise/Voice-Synthesis.git"
url= "https://github.com/zemise/Voice-Synthesis(源码地址)"
}
}
}
}
repositories {
// 发布项目到私服中
maven {
def releasesRepoUrl = PERSONAL_MAVEN_URL
def snapshotsRepoUrl = PERSONAL_MAVEN_SNAPSHOT_URL
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
credentials {
username = PERSONAL_USERNAME
password = PERSONAL_PASSWORD
}
}
// 发布项目到maven中央仓库
maven {
// 中央仓库名
// name 'Nexus_Repo'
def releasesRepoUrl = CENTRAL_URL
def snapshotsRepoUrl = CENTRAL_SNAPSHOT_URL
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
credentials {
username = CENTRAL_USERNAME
password = CENTRAL_PASSWORD
}
}
}
}
signing {
sign publishing.publications.mavenJava
}
jar {
from {
duplicatesStrategy = 'exclude'
exclude 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.SF',
'AUTHORS', 'changelog.*', 'LICENSE*', 'module-info.class', 'README*', 'release-timestamp.*'
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}
4.2 配置gradle.properties
// 配置gradle.properties
// 注意,下方的变量名可随意写,但是要要记得在build.gradle里一一匹配
// personal Maven setting 私人仓库
PERSONAL_MAVEN_URL=https://maven.cellcraft.top/repository/maven-releases/
PERSONAL_MAVEN_SNAPSHOT_URL=https://maven.cellcraft.top/repository/maven-snapshots/
PERSONAL_USERNAME=username
PERSONAL_PASSWORD=password
// Central Maven setting maven中央仓库
CENTRAL_URL=https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/
CENTRAL_SNAPSHOT_URL=https://s01.oss.sonatype.org/content/repositories/snapshots/
CENTRAL_USERNAME=username
CENTRAL_PASSWORD=pathword
// 以下非必要
signing.keyId=63A65AED(公钥编号)
signing.password=私钥密码
signing.secretKeyRingFile=/path/My_Code/java/secring.gpg(私钥存放的绝对路径)
配置完成后,可以点右侧Gradle可视化的publish也可以在项目根目录使用指令
./gradlew publish
# 或者使用本地的gradle
gradle publish
如果没有报错,则上传成功
拓展1:
一旦确定版本号,上传了release版本,那么同一版本再继续上传是无法覆盖的,最后需要在网站里删除才行。而SNAPSHOT版本,似乎是可以覆盖的,因此最好先上传SNAPSHOT版本,测试无误后再上传最终的release版本。
4.3 sonatype Maven登陆
-
前往maven网站登陆查看,右上角登陆输入之前注册时的账号密码。
-
点击左侧Staging Repository,并点击Refresh刷新。
-
选中上传的release版本,点击close,如果无错误,则再点击release即可。
如最开始创建Maven账号提交的issue等待管理审核一样,最后的审核也需要稍微耐心等待些时间。
5. 总结
-
不要使用mac的gpg页面进行导出,导出的文件不是我们使用的私钥文件格式不正确
-
注意公钥一定记得同步到公网上去,不然签名验证会失败