简介

Sonatype 提供了一个叫做开源软件资源库托管Open Source Software Repository Hosting (OSSRH) 的工具,帮助我们来方便的将项目发布到中心仓库中。

但是这个工具和我们的项目构建是割裂的,尤其是在CI集成构建中,很难做到自动化。

Gradle是一个很好的构建工具,灵活而又强大,可不可以直接在Gradle中的任务中直接构建和上传到中央仓库或者其他自定义的nexus仓库中呢?答案是肯定的。

Gradle Nexus Publish Plugin历史

今天要给大家介绍的gradle插件名字叫做Gradle Nexus Publish Plugin,最近才发布了1.0.0版本,有小伙伴可能要问了,gradle出来这么久了,最近才有这样的插件吗?

其实不然,我们来讲一下gradle Nexus发布插件的历史。

2015年,Marcin Zajączkowski创建了gradle-nexus-staging-plugin,该插件可在Nexus存储库管理器中关闭和释放staging存储库。使用这个插件就可以直接从代码中将Gradle项目发布到Maven Central仓库。多年来,它已经在全球各地被多个项目所采用。

但是这个插件存在一个小问题: 由于Gradle发布过程中的技术限制,因此需要使用启发式技术来跟踪隐式创建的staging存储库,对于给定状态的多个存储库,通常会发布失败。尤其是在持续集成服务Travis CI在2019年末更改其网络架构之后,这个插件问题就更多了。

基于这个问题,马克·菲利普(Marc Philipp)创建了另外一个插件Nexus Publish Plugin,该插件丰富了Gradle中的发布机制,可以显式创建staging存储库并直接向其发布(上传)组件。

通常我们需要将这两个插件一起使用,但是,一个功能需要使用到两个插件还是会让用户感到困惑。所以Gradle Nexus Publish Plugin在2020/2021年应运而生了,它的目的就是合并上面两个插件的功能。

插件的使用

在gradle中使用该插件很简单,首先需要引入这个插件:

plugins {
id("io.github.gradle-nexus.publish-plugin") version "«version»"
}

注意,这个插件必须在 Gradle 5.0 或者之后的版本使用,并且在根项目中引入。

接下来,我们需要定义要发布的仓库,如果是通过Sonatype's OSSRH Nexus发布到Maven的中央仓库,那么需要添加sonatype(),如下所示:

nexusPublishing {
repositories {
sonatype()
}
}

在sonatype()中,实际上定义了nexusUrl 和 snapshotRepositoryUrl。

发布到中央仓库是需要用户名密码的,我们需要设置sonatypeUsername 和 sonatypePassword 这两个项目的属性。一种方法是在~/.gradle/gradle.properties 中进行配置,或者设置 ORG_GRADLE_PROJECT_sonatypeUsername 和 ORG_GRADLE_PROJECT_sonatypePassword 这两个环境变量。

或者,可以直接在sonatype 中进行定义:

nexusPublishing {
repositories {
sonatype {
username = "your-username"
password = "your-password"
}
}
}

最后,调用publishToSonatype和 closeAndReleaseSonatypeStagingRepository就可以分别发布到Sonatype和关闭并发布到中央仓库了。

注意,上面的closeAndReleaseSonatypeStagingRepository实际上是包含了两步操作:close和release。我们也可以仅仅调用closeSonatypeStagingRepository,然后手动登录Nexus UI,进行release操作。

下面是两个分别使用groovy和Kotlin的具体的例子:

Groovy DSL

plugins {
id "java-library"
id "maven-publish"
id "io.github.gradle-nexus.publish-plugin" version "«version»"
} publishing {
publications {
mavenJava(MavenPublication) {
from(components.java)
}
}
} nexusPublishing {
repositories {
myNexus {
nexusUrl = uri("https://your-server.com/staging")
snapshotRepositoryUrl = uri("https://your-server.com/snapshots")
username = "your-username" // defaults to project.properties["myNexusUsername"]
password = "your-password" // defaults to project.properties["myNexusPassword"]
}
}
}

Kotlin DSL

plugins {
`java-library`
`maven-publish`
id("io.github.gradle-nexus.publish-plugin") version "«version»"
} publishing {
publications {
create<MavenPublication>("mavenJava") {
from(components["java"])
}
}
} nexusPublishing {
repositories {
create("myNexus") {
nexusUrl.set(uri("https://your-server.com/staging"))
snapshotRepositoryUrl.set(uri("https://your-server.com/snapshots"))
username.set("your-username") // defaults to project.properties["myNexusUsername"]
password.set("your-password") // defaults to project.properties["myNexusPassword"]
}
}
}

默认情况下nexusPublishing中的connectTimeout和clientTimeout是5分钟,可以根据自己的需要进行调整。

插件背后的故事

我们来看一下这个插件背后是怎么工作的。

首先定义的nexusPublishing { repositories { ... } } 会拦截所有子项目的 maven-publish 插件,用来修改发布地址。

如果项目的版本号不是以-SNAPSHOT结尾,这说明是发布版本,那么会创建一个initialize${repository.name.capitalize()}StagingRepository 任务,开启一个新的staging仓库,并且设置好对应的URL。在多项目构建中,所有拥有相同nexusUrl 的子项目,将会使用同样的staging仓库。

initialize${repository.name.capitalize()}StagingRepository为每个配置好的仓库地址,生成发布任务。

为每个发布任务生成一个 publishTo${repository.name.capitalize()} 生命周期task。

在发布任务之后分别创建 close${repository.name.capitalize()}StagingRepositoryrelease${repository.name.capitalize()}StagingRepository 任务。

总结

这么好用的插件,赶紧去试试吧。

本文已收录于 http://www.flydean.com/07-gradle-nexus-publish-plugin/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

使用gradle插件发布项目到nexus中央仓库的更多相关文章

  1. 发布项目到maven中央仓库

    https://www.xiaominfo.com/2017/04/25/swagger-bootstrap-ui-issue-maven-central/?tdsourcetag=s_pcqq_ai ...

  2. Maven系列(十)发布自己的项目到 Maven 中央仓库

    Maven 发布自己的项目到 Maven 中央仓库 可能很多人都在用 Maven 仓库,但是如果要问怎么发布项目到中央仓库,估计很多人都不知道了,下面本篇文章带大家往中央仓库发布一个自己的 Maven ...

  3. maven之发布项目到nexus【clean deploy命令】

    原文:http://m.blog.csdn.net/article/details?id=49667971 当我们的项目开发完成以后,可能要进行发布(如果是独立的项目,就不需要发布啦,如果是模块项目, ...

  4. 如何发布Maven依赖到中央仓库

    平时我们都是从Maven中央仓库下载依赖,如果我们想发布我们自己写的Maven依赖到中央仓库供别人下载使用应该怎么办?这里以上传自己写的simian-maven-plugin(https://gith ...

  5. nexus 中央仓库

    nexus 中央仓库 下载地址:http://www.sonatype.org/nexus/archived 下载最新版本 mkdir -p /opt/local/nexus tar zxvf nex ...

  6. Maven发布项目到Nexus私服中 (发布jar包)

    目录 1 需求说明 2 实现步骤 2.1 Maven服务的setting.xml文件 2.2 项目的pom.xml文件 2.3 发布项目 1 需求说明 开发完项目后, 将项目版本发布到Nexus私服中 ...

  7. 遇到问题----gradle-----myeclipse的gradle插件导入项目报错nsupported major.minor version 51.0

    装好了gradle插件之后 想要导入gradle类型的项目,然后在 build model的过程中发现: 报错nsupported major.minor version 51.0 查了下发现是jdk ...

  8. 我把自己的java库发布到了maven中央仓库,从此可以像Jackson、Spring的jar一样使用它了

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. 将jar包发布到maven的中央仓库细节整理

    在学习springboot框架的时候,会引入各种各样的starter依赖,照着教程尝试写了个demo-spring-boot-stater,可以理解为一个组件,随引随用 但是只能自己引用,无法共享,于 ...

随机推荐

  1. 「NGK每日快讯」11.24日NGK公链第22期官方快讯!

  2. Go 去找个对象吧

    前言 我的读者中应该大部分都是 Java 从业者,不知道写 Java 这些年是否真的有找到对象? 没找到也没关系,总不能在一棵树上吊死,我们也可以来 Go 这边看看,说不定会有新发现. 开个玩笑,本文 ...

  3. Mysql训练:where后不可以进行聚合函数的判断,而having可以进行聚合函数的判断

    力扣题目:查找重复的电子邮箱 编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱. +----+---------+ | Id | Email | +----+---------+ | ...

  4. Bitter.NotifyOpenPaltform : HTTP 异步消息接收调度中心--开源贡献 之 一:简介

    现在互联网的系统越来越趋向于复杂,从单体系统到现在的微服务体系演变.公司与公司的分工也越来越明确. 大数据公司提供了大数据服务 人脸识别公司提供了人脸识别服务 OCR 公司提供了专业的OCR 服务 车 ...

  5. Prism.WPF -- Prism框架使用(下)

    本文参考Prism官方示例 命令使用 Prism提供了两种命令:DelegateCommand和CompositeCommand. DelegateCommand DelegateCommand封装了 ...

  6. JavaScript:什么是回调?

    翻译练习 原博客地址:JavaScript: What the heck is a Callback? 在6分钟内通过简单的例子学习和理解回调的基本原理. 什么是回调? 简单地说:回调就是一个在另一个 ...

  7. 力扣541. 反转字符串 II

    原题 1 class Solution: 2 def reverseStr(self, s: str, k: int) -> str: 3 begin,lens,ans = 0,len(s),' ...

  8. Linux基本命令——系统管理和磁盘管理

    转: Linux基本命令--系统管理和磁盘管理 Linux命令--系统管理和磁盘管理 一.系统管理 1.1 时间相关指令 <1> 查看当前日历: cal <2> 显示或设置时间 ...

  9. vue打开新窗口并且实现传参,有图有真相

    我要实现的功能是打开一个新窗口用来展示新页面,而且需要传参数,并且参数不能显示在地址栏里面,而且当我刷新页面的时候,传过来的参数不能丢失,要一直存在,除非我手动关闭这个新窗口,即浏览器的标签页. 通过 ...

  10. SpringCloud-服务与注册

    SpringCloud- Eureka服务注册与发现 1.概述 springcloud是一个非常优秀的微服务框架,要管理众多的服务,就需要对这些服务进行治理,管理每个服务与每个服务之间的依赖关系,可以 ...