文章目录

  • 简介
  • Gradle Nexus Publish Plugin历史
  • 插件的使用
    • Groovy DSL
    • Kotlin DSL
  • 插件背后的故事
  • 总结

简介

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中央仓库?

    在Maven项目中,90%以上的jar包是通过pom文件直接从开源仓库中获取依赖jar包文件,然后在项目中进行集成使用. 此时如果你有一个开源项目,那么如何将该开源项目发布到Maven中央仓库,让其他 ...

  2. 发布构建到maven中央仓库

    JAVA开源软件开发必备技能 发布构建到maven中央仓库的方法和详细步骤 sonatype介绍 向sonatype提交申请 配置maven GPG签名 发布版本 通知sonatype sonatyp ...

  3. Maven发布自己项目到maven中央仓库

    目录 1. sonatype网站相关 1.1  注册sonatype网站账号 1.2  登录后,新建问题 3. 配置maven--setting.xml 4. 配置maven--pom.xml 4.1 ...

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

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于maven中央仓库 作为一个java程序员,对ma ...

  5. 从零开始上传开源项目到Maven中央仓库

    目录 介绍 简单讲解一下上传到Maven中央仓库流程 Maven(sonatype)账号准备 1.注册Sonatype JIRA账号 2.创建工单 3.验证GroupId 基于域名验证 基于开源仓库的 ...

  6. 在IDEA中为项目引入maven中央仓库中的依赖包

    如果是maven项目直接在pow.xml文件中引入依赖即可,这些依赖包将会下载到maven配置好的仓库中.但是有些时候我们并不希望其下载到全局的仓库中而是只在项目中使用,或者项目根本不是maven项目 ...

  7. Maven使用技巧001--- 离线更新nexus中央仓库索引的方案

    nexus可以在线更新中央仓库索引,但是更新速度慢,而且很有可能下载的索引不全.下面介绍一种离线更新中央仓库索引的方式,速度快并且可靠. 1.访问http://repo.maven.apache.or ...

  8. 如何上传自己的项目到Maven中央仓库

    这段时间一直在做项目,也有一个项目伴随产品,其实也就是为了满足个人开发需求的一个工具类,然后想着为了便于协作开发,不如就放在Maven上,这篇文章主要介绍如何把自己的项目或者Starter上传到Mav ...

  9. 发布个人项目jar包到maven中央仓库详解

    发布个人项目jar包到maven中央仓库详解 1.在sonatype提交发布工单(Issue) sonatype是由社区支持的开源项目托管服务(Open Source Project Reposito ...

最新文章

  1. FastReport.net 使用 Winform WebForm打印
  2. B - Networking - poj 1287
  3. python界面设计-python图形化界面设计tkinter
  4. Android App自适应draw9patch不失真背景
  5. php 浏览商品记录,php浏览历史记录
  6. java请求接口示例_用示例解释Java接口
  7. Adobe illustrator 导出可编辑文本 - 连载 18
  8. 漫步最优化十三——驻点
  9. 我的docker随笔35:jenkins服务部署
  10. C++ 动态开辟二维数组的的方法
  11. javascript 动画效果(多物体缓冲运动,多物体透明度变化,匀速移入移出、链式运动、同时运动)
  12. python无法调用安装的包_无法在Windows 10上使用python2.7/MINGW安装pyslalib软件包
  13. GPIO接口解析【转】
  14. 2018年高教社杯全国大学生数学建模竞赛A题解题思路
  15. MySQL数据库应用与开发答案_MySQL数据库应用与开发习题解答与上机指导(微课版)...
  16. 程序和算法之间,主要有什么关系?
  17. 蓝牙资讯|Q2全球TWS耳机出货量排行出炉,蓝牙音频新技术将推出市场
  18. sql注入漏洞--sqlmap使用
  19. flex实现四个元素分布在盒子的四个角
  20. python 通过ftp自动 上传指定excel文件

热门文章

  1. uva 10305拓扑排序
  2. uva 816(经典bfs例子)
  3. HDU4633(Polya计数)
  4. 用py2exe打包成一个exe文件
  5. OD消息断点的设置方法
  6. 高级数据结构与算法 | AVL树 (高度平衡树)
  7. 第42讲:scrapy框架的基本使用
  8. Python中的shuffle()函数的使用
  9. 再见,Navicat!这个IDEA的兄弟,真香!
  10. Redis内存使用优化与存储