阅读 403

Gradle 将 Java 类库发布到 Maven 中心仓库

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

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

注册 sonatype

这个不用说了吧,打开issues.sonatype.org/注册一个账号就行了

发布 issue

注册以后登录 Sonatype,发布一条 issue

1.png

iShot2021-07-25 19.17.00.png

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

就这样提交就行了,慢慢等待回复(品下面那张图,半小时都不到就可以了!)

3.png

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

4.png

修改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]
      A36DDCA2B4E3D244AA685BC6C2F673BC0FEB0227
uid           [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 Repository
on:
  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:

5.png

其中:

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

完结撒花

在 GitHub 上发布 release,打开s01.oss.sonatype.org/,点击左侧Staging Repositories,你将看到刚才发布的 release 出现在列表中。

确认无误后,可以选中,点击Close,如果成功,点击Release,即可发布类库到 Maven 中心仓库。

文章分类
后端
文章标签