废话少说,先说几个网址:

  • Sonatype
  • Gradle
  • GitHub

这篇文章就从零开始,应用 Gradle 7 将 Java 类库公布到 Maven 核心仓库,并应用GitHub Action实现公布 release 时主动推送。

注册 sonatype

这个不用说了吧,关上https://issues.sonatype.org/注册一个账号就行了

公布 issue

注册当前登录 Sonatype,公布一条 issue

  • Summary:轻易填填就行了,反正我填的是我的项目名。
  • Group Id:填写类库的Group Id,留神如果为独立域名,对方会要求验证域名所有权(验证TXT记录),对方收到 Issue 后会揭示你增加的。
  • Project URL:填我的项目网址,或者 GitHub 地址。
  • SCM url:如果我的项目放 GitHub 上,就填 GitHub 地址加上.git

就这样提交就行了,缓缓期待回复(品上面那张图,半小时都不到就能够了!)

你会看到上面这个没有啥用的回复:

批改build.gradle配置文件

注 1:我应用的 Gradle 版本为最新的 7.1.1,其余版本请自行尝试。

注 2:我的 Gradle 配置文件为 Groovy 版的,Kotlin DSL 版请自行转换。

首先在plugins中增加maven-publishsigning插件,

plugins {    id 'maven-publish'    id 'signing'}

而后在配置文件最初增加以下内容:

java {    withJavadocJar()    withSourcesJar()}javadoc {    options.addStringOption("charset", "UTF-8")    if (JavaVersion.current().isJava9Compatible()) {        options.addBooleanOption('html5', true)    }}publishing {    publications {        mavenJava(MavenPublication) {            artifactId = '构件名称'            from components.java            pom {                name = '我的项目名'                description = '我的项目形容'                url = '我的项目URL'                licenses {                    license {                        name = '许可证名称'                        url = '许可证地址'                    }                }                developers {                    developer {                        id = '开发者ID'                        name = '开发者名'                        email = '开发者邮箱'                    }                }                scm {                    connection = 'scm:git:git://github.com/path/to/repo.git'                    developerConnection = 'scm:git:ssh://github.com/path/to/repo.git'                    url = 'https://github.com/path/to/repo'                }            }        }    }    repositories {        maven {            name = "OSSRH"            if (project.version.toString().endsWith("-SNAPSHOT")) {                url = "https://s01.oss.sonatype.org/content/repositories/snapshots"            } else {                url = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"            }            credentials {                username = findProperty("ossrhUsername") ?: System.getenv("OSSRH_USERNAME")                password = findProperty("ossrhPassword") ?: System.getenv("OSSRH_PASSWORD")            }        }    }}signing {    sign(publishing.publications.mavenJava)}

次要内容为:

  • 生成 JavadocJar
  • 生成 SourcesJar
  • 将 Javadoc 设置为 UTF-8 编码
  • 对公布服务器的设置
  • 签名

创立密钥

对于 Windows 零碎,可通过ChocolateyScoop装置gpg4win

对于 macOS 零碎,能够通过Homebrew装置gpg

brew install gpg

对于 Linux 零碎,可通过包管理工具装置gnupg工具

sudo apt install gnupg  # Debian 系sudo yum install gnupg  # RedHat 系

装置实现后,能够通过gpg --generate-key创立密钥,留神记住设置的明码。

创立实现,输出gpg -k查看生成的密钥,你会看到以下内容:

pub   rsa3072 2021-07-25 [SC] [expires: 2023-07-25]      A36DDCA2B4E3D244AA685BC6C2F673BC0FEB0227uid           [ultimate] TestTest <example@example.com>sub   rsa3072 2021-07-25 [E] [expires: 2023-07-25]

当初确定几个名词,本文的前面会用到:

  • A36DDCA2B4E3D244AA685BC6C2F673BC0FEB0227密钥指纹
  • 密钥指纹的最初 8 位(0FEB0227)为KEYID

当初导出KeyRingFile

gpg --export-secret-keys [密钥指纹] > secret.gpg

[密钥指纹]替换为你的理论值,他将会在当前目录下生成secret.gpg文件,保留备用。

当初将secret.gpg进行BASE64解决,Windows 零碎倡议在Git Bash中执行:

base64 secret.gpg > secret.gpg.base64

当初将公钥上传到公钥服务器(Sonatype 会在多个服务器上查找公钥,例如keys.gnupg.netpool.sks-keyservers.netkeyserver.ubuntu.com),如果一个服务器无奈上传能够尝试另外两个。

gpg --keyserver keyserver.ubuntu.com --send-keys [密钥指纹]

「最初一步」 GitHub Action!

先创立如下文件,文件名随便

name: Publish package to the Maven Central Repositoryon:  release:    types: [created]jobs:  publish:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v2      - name: Set up JDK 11        uses: actions/setup-java@v2        with:          java-version: "11"          distribution: "adopt"      - name: Grant execute permission for gradlew        run: chmod +x gradlew      - name: Build with Gradle        run: ./gradlew build      - name: Decode        run: |          echo "${{secrets.SIGNING_SECRET_KEY_RING_FILE}}" > ~/.gradle/secring.gpg.base64          base64 -d ~/.gradle/secring.gpg.base64 > ~/.gradle/secring.gpg      - name: Publish package        run: gradle publish  -Psigning.keyId=${{secrets.SIGNING_KEY_ID}} -Psigning.password=${{secrets.SIGNING_KEY_PASSWORD}} -Psigning.secretKeyRingFile=$(echo ~/.gradle/secring.gpg)        env:          OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }}          OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}

创立如下 Secrets:

其中:

  • OSSRH_USERNAME:你 Sonatype 的用户名
  • OSSRH_PASSWORD:你 Sonatype 的明码
  • SIGNING_KEY_ID:下面提到的KEYID,8 位的
  • SIGNING_KEY_PASSWORD:设置的私钥明码
  • SIGNING_SECRET_KEY_RING_FILEsecret.gpg.base64中的内容

完结撒花

在 GitHub 上公布 release,关上https://s01.oss.sonatype.org/,点击左侧Staging Repositories,你将看到方才公布的 release 呈现在列表中。

确认无误后,能够选中,点击Close,如果胜利,点击Release,即可公布类库到 Maven 核心仓库。