登录/注册 Sonatype 帐号

进入 Sonatype 地址 进行登录或注册。

Img

新建工单

  1. 在页面顶部点击 新建 按钮,创建新的工单。
  2. 填写工单信息

    项目问题类型 保持默认即可。

    Img

    如果没有自己的域名,可以使用 Github 的地址作为自己的Group Id,例如你的 Github 账号地址为 https://github.com/xiaoming,那你的Group Id 就是 com.github.xiaoming。

    这是示例的工单信息:

    Img

  3. 创建工单后,会生成一个状态为(Open)的工单,耐心等待审核人回复。
  4. 如果是用 Github 地址当 Group Id 的话,需要创建一个开放的仓库地址。

    Img

  5. 如果是自定义域名的话,审核人会让你添加一条 类型为 TXT 的 DNS 解析记录。

    Img

    登录你的域名解析后台界面,添加解析记录。

    Img

  6. 完成上述操作后,在工单页面进行评论,并且将工单状态 从 Waiting for Response 改为 Open

    Img

  7. 审核通过后,会收到类似下面的回复,并将工单状态修改为已解决。

    Img

创建 GPG 签名

  1. 安装 GPG:Gpg4win 官网地址
  2. 安装完成后打开 cmd,运行 gpg --gen-key 命令新建密钥对:

    Img

    记住证书密码,在使用证书时需要输入此密码。

    创建完成后会返回一个 pub 串,执行以下命令将 pub 上传到 key 验证库:

    Img

    gpg --keyserver [服务器地址] --send-keys [pub]

    为了以防万一,可以多发布几个服务器地址:

  3. 打开 Kleopatra 软件,导出证书,注意后缀需要修改为 gpg 格式。

Gradle 配置

我这里参考的是 爱组搭 的一些配置。

在项目根目录下新建文件 gradle.properties

SONATYPE_NEXUS_UN=Sonatype的用户名
SONATYPE_NEXUS_PS=Sonatype的密码

signing.keyId=证书的ID(pub串的后8位)
signing.password=创建证书时的证书密码
signing.secretKeyRingFile=证书所在位置

修改 build.gradle 文件:

apply plugin: 'java-library'
apply plugin: 'maven-publish'
apply plugin: 'signing'
apply plugin: "io.spring.dependency-management"

ext {
    configuration = [
            // JDK 版本
            javaVersion = JavaVersion.VERSION_17
    ]

}

// 编译脚本
buildscript {
    ext {
        // SpringBoot 版本
        springBootVersion = "3.1.3"
    }

    // 仓库配置
    repositories {
        mavenLocal()
        maven { url 'https://maven.aliyun.com/repository/central' }
        maven { url 'https://maven.aliyun.com/repository/spring' }
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://repo.spring.io/release' }
        maven { url 'https://repo.spring.io/milestone' }
        mavenCentral()
    }

    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

group = 'Group Id'
version = '版本号'

description = "项目描述"

sourceCompatibility = "${javaVersion}"
targetCompatibility = "${javaVersion}"

tasks.withType(JavaCompile).configureEach {
    options.encoding = 'UTF-8'
}

// 仓库配置
repositories {
    mavenLocal()
    maven { url 'https://maven.aliyun.com/repository/central' }
    maven { url 'https://maven.aliyun.com/repository/spring' }
    maven { url 'https://maven.aliyun.com/repository/google' }
    maven { url 'https://repo.spring.io/release' }
    maven { url 'https://repo.spring.io/milestone' }
    mavenCentral()
}

// 依赖管理
dependencyManagement {
    imports {
        mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
    }
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter:${springBootVersion}")

    compileOnly("org.projectlombok:lombok")
    annotationProcessor("org.projectlombok:lombok")
    testAnnotationProcessor("org.projectlombok:lombok")
    testCompileOnly("org.projectlombok:lombok")

    testCompileOnly("org.springframework.boot:spring-boot-starter-test:${springBootVersion}")
}

tasks.register('sourcesJar', Jar) {
    dependsOn classes
    archiveClassifier = 'sources'
    from sourceSets.main.allSource
}

javadoc {
    options {
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version true
        failOnError false
        links "http://docs.oracle.com/javase/7/docs/api"
    }
}

tasks.register('javadocJar', Jar) {
    dependsOn javadoc
    archiveClassifier = 'javadoc'
    from 'build/docs/javadoc'
}

artifacts {
    archives sourcesJar
    archives javadocJar
}


tasks.named('test') {
    useJUnitPlatform()
}

publishing {
    repositories {
        maven {
            def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
            def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl

            credentials {
                username SONATYPE_NEXUS_UN
                password SONATYPE_NEXUS_PS
            }
        }
    }
    publications {

        mavenJava(MavenPublication) {
            from components.java

            artifact sourcesJar
            artifact javadocJar

            pom {
                name = '项目名称'
                packaging 'jar'
                description = '项目介绍'
                url = '项目地址'

                scm {
                    connection = 'scm:git@github.com:Codearte/gradle-nexus-staging-plugin.git'
                    developerConnection = 'scm:git@github.com:Codearte/gradle-nexus-staging-plugin.git'
                    // 仓库地址
                    url = 'https://github.com/xxx/xxx.git'
                }

                licenses {
                    // 开源协议信息
                    license {
                        name = 'The Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }

                // 开发者信息
                developers {
                    developer {
                        id = '组织名'
                        name = '开发者名称'
                        email = '开发者邮箱'
                    }
                }

                withXml {
                    def root = asNode()
                    root.dependencies.'*'.findAll {
                        def d = it
                        d.scope.text() == 'runtime' && project.configurations.findByName("implementation").allDependencies.find { dep ->
                            dep.name == it.artifactId.text()
                        }.each() {
                            d.scope*.value = 'compile'
                            d.appendNode('optional', true)
                        }
                    }
                }
            }
        }
    }

    signing {
        sign publishing.publications.mavenJava
    }
}

打包发布

idea 打开 Gradle 工具窗口,点击 publish 进行发布。

Img

发布成功:

Img

注意:

第一次发布需要在版本号后加 -SNAPSHOT 以发布快照版本。

确认发布

进入 Sonatype Nexus 并登录,点击右侧菜单中的 Staging Repositories,然后点击 Refresh 按钮,刷新列表。

Img

可以看到是刚刚发布的记录,确认没有问题后选中此条记录,点击 Close 按钮,然后点击 Release 按钮进行确认发布正式版本。

Img

然后就会收到一份这样的邮件,之后就会在 Maven 中央仓库 中找到发布的 jar 包,阿里云等其他镜像仓库也会陆续同步。

Img

最后修改:2023 年 09 月 05 日
温柔的好天气总是和我一样,帅的鸭皮!