登录/注册 Sonatype 帐号
进入 Sonatype 地址 进行登录或注册。
新建工单
- 在页面顶部点击
新建
按钮,创建新的工单。 填写工单信息
项目
与问题类型
保持默认即可。如果没有自己的域名,可以使用 Github 的地址作为自己的Group Id,例如你的 Github 账号地址为 https://github.com/xiaoming,那你的Group Id 就是 com.github.xiaoming。
这是示例的工单信息:
- 创建工单后,会生成一个状态为(Open)的工单,耐心等待审核人回复。
如果是用 Github 地址当 Group Id 的话,需要创建一个开放的仓库地址。
如果是自定义域名的话,审核人会让你添加一条 类型为 TXT 的 DNS 解析记录。
登录你的域名解析后台界面,添加解析记录。
完成上述操作后,在工单页面进行评论,并且将工单状态 从
Waiting for Response
改为Open
。审核通过后,会收到类似下面的回复,并将工单状态修改为已解决。
创建 GPG 签名
- 安装 GPG:Gpg4win 官网地址
安装完成后打开
cmd
,运行gpg --gen-key
命令新建密钥对:记住证书密码,在使用证书时需要输入此密码。
创建完成后会返回一个 pub 串,执行以下命令将 pub 上传到 key 验证库:
gpg --keyserver [服务器地址] --send-keys [pub]
为了以防万一,可以多发布几个服务器地址:
- 打开
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
进行发布。
发布成功:
注意:
第一次发布需要在版本号后加 -SNAPSHOT
以发布快照版本。
确认发布
进入 Sonatype Nexus 并登录,点击右侧菜单中的 Staging Repositories
,然后点击 Refresh
按钮,刷新列表。
可以看到是刚刚发布的记录,确认没有问题后选中此条记录,点击 Close
按钮,然后点击 Release
按钮进行确认发布正式版本。
然后就会收到一份这样的邮件,之后就会在 Maven 中央仓库 中找到发布的 jar 包,阿里云等其他镜像仓库也会陆续同步。