注册Sonatype JIRA账号
网址:https://issues.sonatype.org/
创建Issue
填写资料
点击create
必填项:
Project:Community Support - Open Source Project Repository Hosting
Issue Type:New Project
Summary:JAR包名称,如:JpaMapper
Group Id:如 com.github.test,如果是个人域名,填写个人的groupId,如:show.lmm
Project URL:项目站点
SCM url:项目源码仓库,如:https://github.com/lmm1990/tenant-spring-boot-starter.git
其他内容不用填写,默认即可。
创建完成后会出现一个issues
group id为github
根据Comments信息在github创建对应的仓库,然后回复:Hello, the public repo has created.
group id为自定义域名
根据Comments信息,在域名解析中加入TXT记录,然后回复:Add a DNS TXT record success
如果一切顺利,那么你会收到审核人员,这样的一个评论:
发布
对于发布来说,有两个地址:
releases :
表示正式版,稳定版本
需要 gpg 签名才可以发布成功
不需要 -SNAPSHOT 后缀
snapshots :
快照版, 不稳定的,开发的时候常用;
必须携带 -SNAPSHOT 后缀
上面的配置对于 snapshots 已经可以发布了,只要执行 task publishMavenJavaPublicationToxxx 对应的仓库名称即可;
GPG生成
如果使用的是windows,可以下载gpg4win,下载地址:https://www.gpg4win.org/download.html
安装后打开kleopatra,选择:文件 -》新建秘钥对 -》创建个人OpenPGP密钥对。输入名字、邮箱地址,选中 Protect the generated key wi th a passphrase,输入密码,等待秘钥创建成功。
导出GPG证书
gpg --export-secret-keys 7F4D945C975F88DC099CE60B68508EE02B812EDF > secret.gpg
生成吊销证书
注意:这个 gpg 你在上传到服务器之前需要生成 吊销证书.rev 。以后还可以使用这个证书进行取消的。不然就没法取消了
gpg 的详细教程可以参考阮一峰的教程:http://www.ruanyifeng.com/blog/2013/07/gpg.html
发布证书
gpg --keyserver keyserver.ubuntu.com --send-keys 7F4D945C975F88DC099CE60B68508EE02B812EDF
查询证书
gpg --keyserver keyserver.ubuntu.com --recv-keys 7F4D945C975F88DC099CE60B68508EE02B812EDF
结果:
gpg: key 68508EE02B812EDF: "liumingming <544484078@qq.com>" not changed
gpg: Total number processed: 1
gpg: unchanged: 1
准备工作
文件要求
为了确保中央存储仓库中可用组件的质量水平,OSSRH
对提交的文件有明确的要求
example-application-1.4.7.pom
example-application-1.4.7.pom.asc
example-application-1.4.7.jar
example-application-1.4.7.jar.asc
example-application-1.4.7-sources.jar
example-application-1.4.7-sources.jar.asc
example-application-1.4.7-javadoc.jar
example-application-1.4.7-javadoc.jar.asc
- 除了jar包和pom文件,Javadoc和Sources是必须的,后面会说到用Gradle的一些插件来生成
- 每个文件都有一个对应的asc文件,这是GPG签名文件,可以用于校验文件
Gradle配置
build.gradle
// ... 在最下面新增以下代码
apply plugin: 'maven-publish'
apply plugin: 'signing'
compileJava {
sourceCompatibility = 1.8
targetCompatibility = 1.8
[compileJava]*.options*.encoding = 'UTF-8'
}
compileTestJava {
sourceCompatibility = 1.8
targetCompatibility = 1.8
[compileTestJava]*.options*.encoding = 'UTF-8'
}
task sourcesJar(type: Jar) {
archiveClassifier.set('sources')
from sourceSets.main.allJava
}
// 生成 javadoc jar
task javadocJar(type: Jar) {
archiveClassifier.set('javadoc')
from javadoc.destinationDir
}
// javadoc 配置,这里是自定义了 java doc 的一些配置
javadoc {
description = "Generates project-level javadoc for use in -javadoc jar"
options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED
options.author = true
options.version = true
options.header = project.name
options.addStringOption('Xdoclint:none', '-quiet')
// suppress warnings due to cross-module @see and @link references;
// note that global 'api' task does display all warnings.
logging.captureStandardError LogLevel.INFO
logging.captureStandardOutput LogLevel.INFO // suppress "## warnings" message
options.encoding = "UTF-8"
options.charSet = 'UTF-8'
}
artifacts {
archives javadocJar, sourcesJar
}
publishing {
// 定义发布什么
publications {
mavenJava(MavenPublication) {
from components.java
artifact sourcesJar
artifact javadocJar
pom {
// 构件名称
// 区别于artifactId,可以理解为artifactName
name = '基于spring boot+mybatis的多租户插件'
// 构件描述
description = '基于spring boot+mybatis的多租户插件'
// 构件主页
url = 'https://github.com/lmm1990/tenant-spring-boot-starter'
// 许可证名称和地址
licenses {
license {
name = 'MIT License'
url = 'https://github.com/lmm1990/tenant-spring-boot-starter/blob/main/LICENSE'
}
}
// 开发者信息
developers {
developer {
name = 'liumingming'
email = '544484078@qq.com'
}
}
// 版本控制仓库地址
scm {
url = 'https://github.com/lmm1990/tenant-spring-boot-starter'
connection = 'scm:git:git://github.com/lmm1990/tenant-spring-boot-starter.git'
developerConnection = 'scm:git:ssh://git@github.com:lmm1990/tenant-spring-boot-starter.git'
}
}
}
}
// 定义发布到哪里
repositories {
maven {
name 'sonatypeRepository'
url "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
credentials {
username = "${sonatypeUsername}"
password = "${sonatypePassword}"
}
}
maven {
name = 'sonatypeSnapshotRepository'
url = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
credentials {
username = "${sonatypeUsername}"
password = "${sonatypePassword}"
}
}
}
}
signing {
sign publishing.publications.mavenJava
}
工程根目录下新增 gradle.properties
signing.keyId=密钥keyId(秘钥id后8位)
signing.password=密钥password
signing.secretKeyRingFile=私钥keyRingFile路径
sonatypeUsername=sonatype账号
sonatypePassword=sonatype密码
提交到Sonatype仓库
idea Gradle面板中运行:publishMavenJavaPublicationToSonatypeRepositoryRepository
到Sonatype OSS发布
登录:https://s01.oss.sonatype.org/
点击左侧Build Promotion -》Staging Repositories,在右侧可以看到已提交的jar包
Close
你的提交在未处理前,是open状态,然后点击Close按钮。等待status变为closed
Release
一般情况下,感觉如果顺利close后,再次选中点击Release,耐心等待一会,就大功告成了!
可以在侧边栏Artifact Search
中搜索下你的 groupId
,此时应该能看到对应的构件名称和版本了
回复Issue
但是很抱歉,到此为止,你的jar包,还不会同步到maven仓库中
你需要在你原先创建issue中,告诉下管理人员,你已经完成了第一次发布
我用我蹩脚的英文,回复如下:
I have already completed the first release.
然后管理人员给我回复了:
Central sync is activated for show.lmm. 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.
OK,至此,你的构建就会同步到Maven Central Repository了。
新版本更新
只要完成第一个发布,后续就不需要再创建issue了,只要重复:提交到Sonatype仓库、到Sonatype OSS发布 2步就可以了。