gradle发布代码到maven中央仓库
- 环境
- github
- Sonatype JIRA
- 注册sonatype账号
- 创建一个新的项目票据
- 创建密钥
- 下载密钥工具
- 新建密钥
- 设置密钥
- 设置密钥的密码并生成吊销证书妥善保存
- 导出私钥和公钥
- 将密钥上传到公共密钥服务器
- 项目配置
- 创建全局变量配置
- 编译脚本
- 管理和发版
- 发布到release
- close仓库
- release
- 项目中验证结果
想把自己写的一些代码发布到maven中央仓库,避免来回拷贝代码的步骤,百度了几篇文章照着做发现描述的不完整,要不就是在gradle用maven的方式搞提交的,但是一些配置在gradle里根本不需要,着实浪费时间,所以特在此记录一下我的操作步骤,希望能节省大家的时间。
发布到中央仓库有两个不同的选择:1.使用自己的域名(需要做域名验证)步骤较多,2.使用自己的github,考虑到大家不是都有域名这里选择github方式,步骤少。
环境
组件 | 版本 |
---|---|
Windows | 10 |
IDEA | 2020.3 |
Gradle | 6.4.1 |
Kleopatra gpg4win | 3.1.16 |
需要github账号
需要一个邮箱账号后面接受各种通知信息使用,比如outlook、qq、163邮箱应该都可以,我这里使用的outlook。
注:整个过程不需要连外网,不过在上github可能会慢一些,影响不大
github_19">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'