想把自己写的一些代码发布到maven中央仓库,避免来回拷贝代码的步骤,百度了几篇文章照着做发现描述的不完整,要不就是在gradle用maven的方式搞提交的,但是一些配置在gradle里根本不需要,着实浪费时间,所以特在此记录一下我的操作步骤,希望能节省大家的时间。
发布到中央仓库有两个不同的选择:1.使用自己的域名(需要做域名验证)步骤较多,2.使用自己的github,考虑到大家不是都有域名这里选择github方式,步骤少。

环境

组件版本
Windows10
IDEA2020.3
Gradle6.4.1
Kleopatra gpg4win3.1.16

需要github账号

需要一个邮箱账号后面接受各种通知信息使用,比如outlook、qq、163邮箱应该都可以,我这里使用的outlook。

注:整个过程不需要连外网,不过在上github可能会慢一些,影响不大

github

需要先到github上创建一个公共仓库(public repository),这是是要绑定到maven上的,仓库名字什么的没要求。

但是你提交到maven中央仓库的并不是你github上的内容而是你本地的东西。

Sonatype JIRA

中央仓库是Sonatype公司出资维护的,所以我们的发布流程跟它就有很多的关系。

注册sonatype账号

https://issues.sonatype.org/secure/Dashboard.jspa

注册一个账号,登录。

注册
在这里插入图片描述

创建一个新的项目票据

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
输入完毕没有问题后,点击模态框右下角的“新建”按钮。

然后你会收到一份来自issues@sonatype.org的邮件。
内容如下:
就是说你成功创建了一个票据。
在这里插入图片描述

第二封邮件

在这里插入图片描述
按照指示操作即可。

创建完github仓库后回到票据回复下,如果长时间没有得到回复重新编辑下票据也行,就在描述里面随便输入些内容再提交就可以。
在这里插入图片描述
在这里插入图片描述

第三封邮件
收到如下内容的邮件表示票据已经解决,可以进行下个流程了。

在这里插入图片描述


创建密钥

需要pgp密钥才能把项目发布的中央仓库。

下载密钥工具

这个是Windows平台下面的gpg密钥工具,mac的朋友请自行找可用的工具。

https://files.gpg4win.org/gpg4win-3.1.16.exe

新建密钥

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

设置密钥

在这里插入图片描述
打开最下面的“细节”。

设置密钥的密码并生成吊销证书妥善保存

在这里插入图片描述

导出私钥和公钥

在这里插入图片描述
在这里插入图片描述

将密钥上传到公共密钥服务器

这个是必需的,因为sonatype最后是要到公共密钥服务器上检测密钥的,不然会在发布release版本的时候失败。

在这里插入图片描述

gpg --keyserver https://keys.openpgp.org --recv-keys 密钥指纹

发送中gpg: sending key 38DA5552E8887423 to https://keys.openpgp.org

命令执行后你会收到一封密钥验证邮件

在这里插入图片描述
点击链接发送验证密钥邮件
在这里插入图片描述

接着会收到验证邮件

在这里插入图片描述
在这里插入图片描述
好了,密钥这边已经Ok.


项目配置

在这里插入图片描述

创建全局变量配置

配置gradle.properties

ossrhUsername=asdf  // sonatype username
ossrhPassword=Sonatypeuserpwd // sonatype 密码

signing.keyId=WW1A82WW   // 密钥指纹的最后8位
signing.password=reeee21 // 设置的密钥密码
signing.secretKeyRingFile=fishking_0xWW1A82WW_SECRET.gpg // gpg私钥的路径

编译脚本

build.gradle

plugins {
    id 'java'
    id 'maven' // 为了产生pom.xml文件
    id 'signing'  // 组件签名插件
}

//  组 和 版本配置
group = "io.github.wangxxxxxx"
archivesBaseName = "commons"
version = "0.0.1"
// 编译版本和编码配置
sourceCompatibility = 1.8

compileJava {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    [compileJava]*.options*.encoding = 'UTF-8'
}
compileTestJava {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    [compileTestJava]*.options*.encoding = 'UTF-8'
}

// 跳过所有文件的编译测试;不是跳过compileTestJava task 而是在执行该task的时候,跳过所有的测试文件
test {
    exclude '**/*.class'
}

repositories {
    mavenCentral()
}

dependencies {
// 这些依赖可以不要
    compile 'org.slf4j:slf4j-api:1.7.25'
    testCompileOnly 'junit:junit:4.12'
    testCompileOnly 'org.apache.commons:commons-lang3:3.8.1'
    testCompileOnly 'ch.qos.logback:logback-core:1.1.7'
    testCompileOnly 'ch.qos.logback:logback-classic:1.1.7'
    testCompileOnly 'org.apache.commons:commons-csv:1.6'
}

//对于典型的 Java 项目,您可以添加一个javadocJar以及一个 sourcesJar任务
task javadocJar(type: Jar) {
    classifier = 'javadoc'
    from javadoc
}

task sourcesJar(type: Jar) {
    classifier = 'sources'
    from sourceSets.main.allSource
}
// 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'
}
// 并将它们与项目 jar 本身一起连接到 artifacts 集合中:
artifacts {
    archives javadocJar, sourcesJar
}
// 将构建的包签名
signing {
    sign configurations.archives
}
//元数据定义和上传︎
uploadArchives {
    repositories {
        mavenDeployer {
            beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

            repository(url: "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") {
                authentication(userName: ossrhUsername, password: ossrhPassword)
            }

            snapshotRepository(url: "https://s01.oss.sonatype.org/content/repositories/snapshots/") {
                authentication(userName: ossrhUsername, password: ossrhPassword)
            }

            pom.project {
                name 'Example Application'
                packaging 'jar'
                // optionally artifactId can be defined here
                description "A application used as an example on how to set up pushing  its components to the Central Repository."
                url 'http://www.example.com/example-application'

                scm {
                    connection 'scm:svn:http://foo.googlecode.com/svn/trunk/'
                    developerConnection 'scm:svn:https://foo.googlecode.com/svn/trunk/'
                    url 'http://foo.googlecode.com/svn/trunk/'
                }

                licenses {
                    license {
                        name 'The Apache License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }

                developers {
                    developer {
                        id 'manfred'
                        name 'Manfred Moser'
                        email 'manfred@sonatype.com'
                    }
                }
            }
        }
    }
}


在这里插入图片描述
在这里插入图片描述
输出上面的日志表示上传成功。

管理和发版

进入到 nexus repository manager

https://s01.oss.sonatype.org/#view-repositories

右上角Log In,输入Sonatype的账号和密码。

在这里插入图片描述
可以在自己的仓库看到了上传的东西。
uploadArchives之后我们的东西上传到了staging仓库里面。
在这里插入图片描述
staging实际算是我们的待发布仓库。

发布到release

close仓库

close实际是检测仓库的一个过程,检测没问题才可以发布。

在staging仓库里面选择要发布的那个,然后点击上面的close
在这里插入图片描述
此时可以在activity里面看到验证和构建过程。

在这里插入图片描述
在这里插入图片描述
输出Repository closed则表示没问题。

下面就是要release仓库了。

release

release就是将仓库发布到maven中央仓库,这也是我们要做的最后一步。
在这里插入图片描述

release之后我们会收到一封report邮件。
在这里插入图片描述
此时我们已经可以在中央仓库搜索到我们提交的东西了。

在这里插入图片描述
可以看到是release版本。
可以在项目中引入这个库了。


项目中验证结果

maven中央仓库同步到国内的源是需要时间的,要保证项目里maven中央仓库的优先级在上面。

    repositories {
        mavenLocal()
        
        maven {
            url = uri('https://repo1.maven.org/maven2/')
        }
        maven {
            url = uri('https://maven.aliyun.com/repository/public')
        }
	}

引入依赖

implementation group: 'io.github.wangxvdong', name: 'commons', version: '0.0.2'

在这里插入图片描述


Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐