gradle项目发布到maven中央仓库


注册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步就可以了。


文章作者: Ming Ming Liu
文章链接: https://www.lmm.show/16/
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ming Ming Liu !
  目录