使用 Java 开发 Gradle 插件的步骤

目录
  • 1创建项目
  • 2动手开发
  • 3发布插件
    • 3.1发布到Maven仓库
    • 3.2发布到Gradle官方插件门户
  • 4更多
    • 4.1在插件中添加任务
    • 4.2添加扩展
  • 5小结
  • 6参考内容

Gradle 插件代码可以在 build.gradle 中,buildSrc 项目中,以及独立的插件项目中编写。本文将介绍如何在一个独立的项目中使用 Java 语言编写 Gradle 插件,并发布到仓库中。

1 创建项目

Gradle 插件项目和普通的 Java 项目没有什么不同,普通项目是基于其它三方包进行开发,而 Gradle 插件项目基于 Gradle 的 API 进行开发。

基于 Gradle 创建一个 Java 项目,项目目录结构如下,和普通项目一样。

gradle-plugin-sample
|
├───build.gradle
├───settings.gradle
└───src
 ├───main
 │ ├───java
 │ └───resources
 └───test
  ├───java
  └───resources

引入 Gradle API 相关的 jar 包。为了方便起见,可以通过 gradle 插件 java-gradle-plugin 来引入 Java 插件,引入 Gradle API 相关依赖以及生成插件相关的描述符。

build.gradle

plugins {
 id 'java-gradle-plugin'
}

group 'com.robothy'
version '1.0-SNAPSHOT'

repositories {
 mavenLocal()
 mavenCentral()
}

wrapper{
 gradleVersion = '6.7'
}

2 动手开发

项目创建好之后,就可以开始动手开发了。从项目构建角度来看,Gradle 插件是一段可重用的构建逻辑,这段逻辑能够被应用到各个项目当中。更具体来说,Gradle 插件是一个实现了 org.gradle.api.Plugin 接口的类,它被 Project (可以认为是 build.gralde, 它本质是一个实现了 Project 接口的类)所引用。开发插件的本质就是往 build.gradle 中插入一段逻辑。

void apply​(T target)

Plugin 是一个泛型接口,有一个抽象方法 apply,它的参数类型可以是 Project, Settings, 或者 Gradle。

  • 类型为 Project,插件可以应用于 build.gradle;
  • 类型为 Settings,插件可应用于 settings.gradle;
  • 类型为 Gradle, 插件可应用于 Gradle 初始化脚本。

在应用插件时,gradle 会创建一个插件类的实例,并调用 apply 方法。因此,插件的逻辑就是 apply 方法中的代码。

一个独立的项目中可以有多个实现了 Plugin 接口的类,意味着一个项目可以包含多个插件。每一个插件都需要在 build.gradle 中添加相应的描述,java-gradle-plugin 会根据这些描述生成插件描述符(jar 包中的一个文件)。

假设要在 gradle-plugin-sample 项目中创建两个插件 hello, goodbye,需要进行如下两个步骤:

1)创建插件类

HelloPlugin.java

import org.gradle.api.Plugin;
import org.gradle.api.Project;

public class HelloPlugin implements Plugin<Project> {
 @Override
 public void apply(Project project) {
  System.out.println("Message from hello plugin.");
 }
}

GoodbyePlugin.java

import org.gradle.api.Plugin;
import org.gradle.api.Project;

public class GoodbyePlugin implements Plugin<Project> {
 @Override
 public void apply(Project project) {
  System.out.println("Message from goodbye plugin.");
 }
}

2)在 build.gradle 中添加描述内容

描述内容需要指定插件的 ID 和插件的入口类。

gradlePlugin {
 plugins {
  helloPlugin {
   id = 'com.robothy.hello'
   implementationClass = 'com.robothy.HelloPlugin'
  }
  googbyePlugin{
   id = 'com.robothy.goodbye'
   implementationClass = 'com.robothy.GoodbyePlugin'
  }
 }
}

完成上面步骤之后,一个简单的插件就算完成了开发,接下来就可以发布和使用了。

3 发布插件

插件可以发布到 Maven 仓库和 Gradle 官方插件门户。

3.1 发布到 Maven 仓库

发布插件到 Maven 仓库和发布普通的 jar 包一样,需要用到 maven-publish 插件。要发布到远程 Maven 仓库可能需要提供认证信息,这里简单起见只发布到本地仓库。

1)在 build.gradle 文件中添加 maven-publish 插件

plugins {
 id 'java-gradle-plugin'
 id 'maven-publish'
}

2)执行 gradle publishToMavenLocal,成功之后可以在 ~/.m2 目录下找打发布的 jar 包。

要使用发布到 Maven 仓库中的 Gradle 插件,需要先在 settings.gradle 中指定仓库。如下代码指定了插件仓库有本地 Maven 和 Gradle 插件门户。

pluginManagement {
 repositories {
  mavenLocal()
  gradlePluginPortal()
 }
}

3.2 发布到 Gradle 官方插件门户

我们平常使用的大部分插件来自于 Gradle 官方插件门户,开发人员注册一个 Gradle 账号之后可以将插件发布到门户,这样其他人就可以很方便地使用了。按照如下步骤发布插件,这里如果没有描述清楚可以移步 Gradle 官网文档:How do I add my plugin to the plugin portal?

1)注册门户账户

2)创建 API Key。注册好账户就能够看见了。

3)将 API Key 添加到文件 ~/.gradle/gradle.properties

4)使用插件发布插件 com.gradle.plugin-publish 发布插件(不是病句,只是有点绕 😔)

将 com.gradle.plugin-publish 添加到插件项目 gradle-plugin-sample 的 build.gradle 中,然后添加插件的描述信息。

pluginBundle {
 website = 'http://www.gradle.org/'
 vcsUrl = 'https://github.com/gradle/gradle'
 description = 'Greetings from here!'
 tags = ['greetings', 'salutations']

 plugins {
 greetingsPlugin {
  // id='com.robothy.hello' 可以省略,因为在 gradlePlugin 配置块中已经有 id 信息了
  displayName = 'Hello Plugin'
 }
 }
}

5)使用 gradle publishPlugins 发布插件

如果插件信息描述正确,执行 puhlishPlugins 任务之后会打印出待审核的信息,之后就是等待了(本人发布的插件 com.robothy.cn-repo 经过了四五个小时就审核通过了)。

Publishing plugin com.robothy.cn-repo version 1.0
Thank you. Your new plugin com.robothy.cn-repo has been submitted for approval by Gradle engineers. The request should be processed within the next few days, at which point you will be contacted via email.

4 更多

4.1 在插件中添加任务

先自定义一个 Gradle 任务类 SayHelloTask,该任务的行为是简答的打印固定的字符串。自定义任务需要继承 DefaultTask。

public class SayHelloTask {
 @TaskAction
 public void hello() {
  System.out.println("Hello, World!");
 }
}

然后通过 project 往项目中注册一个 SayHelloTask 的实例,任务名为 task。

public class HelloPlugin implements Plugin<Project> {
 @Override
 public void apply(Project project) {
  System.out.println("Message from hello plugin.");
  project.getTasks().register("hello", SayHelloTask.class);
 }
}

当然,也可以在使用 HelloPlugin 插件的 build.gradle 中注册任务。

task hello(type: com.robothy.SayHelloTask)

重新发布插件,执行下面命令时控制台会打印出 "Hello, World!"。

gradle hello

4.2 添加扩展

Gradle 插件可以往 project 中注册扩展,开发人员可以通过扩展设置一些参数值,以供其它的 Gradle Task 使用。假设我们希望在 build.gradle 中添加如下配置信息。

user {
 name = 'Robothy'
 country = 'China'
}

首先,创建一个配置信息接口,接口中只包含 getter 抽象方法。需要注意的是,返回的类型为 Property,并非直接返回 String。配置信息不需要创建为 Java 类,Gradle 在运行时会通过动态代理的方式自动往代理对象中注入值。

public interface User {
 Property<String> getName();
 Property<String> getCountry();
}

然后插件就可以往 project 中添加一个扩展了。

project.getExtensions().add("user", User.class);

重新发布插件,此时引入了插件的项目就可以在 builde.gradle 中添加本小节开头描述的配置块了。

Gradle 任务可以通过如下方式访问到这些配置信息。

User user = (User) (project.getExtensions().getByName("user"));

5 小结

本文主要介绍了如何使用纯 Java 语言在一个独立的项目中编写 Gradle 插件,插件主要通过通过传入的 project 参数访问项目,往项目的构建生命周期中插入一些逻辑或者添加配置信息。插件可以发布到私有的 Maven 仓库,也可以发布到 Gradle 插件门户。插件项目中还可以很好地封装一些 Gradle Task,定义一些配置类型。

6 参考内容

[1] Build Script Basics

[2] How do I add my plugin to the plugin portal?

[3] Developing Custom Gradle Plugins

以上就是使用 Java 开发 Gradle 插件的步骤的详细内容,更多关于Java 开发 Gradle 插件的资料请关注我们其它相关文章!

(0)

相关推荐

  • 现代高效的java构建工具gradle的快速入门

    目录 和Maven一样,Gradle只是提供了构建项目的一个框架,真正起作用的是Plugin.Gradle在默认情况下为我们提供了许多常用的Plugin,其中包括有构建Java项目的Plugin,还有War,Ear等.与Maven不同的是,Gradle不提供内建的项目生命周期管理,只是java Plugin向Project中添加了许多Task,这些Task依次执行,为我们营造了一种如同Maven般项目构建周期.更多有关Maven的知识,读者可以访问Maven官网,或者可以参考笔者写的Maven学

  • Java动态脚本Groovy获取Bean技巧

    目录 一.使用BeanFactoryPostProcessor注入Bean: 第一步:创建实现SpringUtils 接口工具(组件)来获取spring bean 第二步:创建Groovy脚本装载类,动态解析脚本为Class 第三步:读取脚本内容,执行脚本 第四步:在resources目录下创建.groovy文件 第五步:实例化脚本,执行方法  二.使用ApplicationContext注入Bean 第一步:修改项目启动类,获得ApplicationContext 第二步:修改resource

  • Java动态脚本Groovy

    目录 1.Groovy特性 2.核心涉及 3.Java与Groovy转换 第一步:引入Groovy依赖 第二步:创建interface接口声明方法 第三步:在resources目录下创建.groovy文件 第四步:创建Groovy脚本装载类,动态解析脚本为Class 第五步:读取脚本内容,执行脚本 4.Groovy特性验证 第一步:将之前Groovy脚本数据修改.存于数据库表中,动态加载脚本 第二步:数据库表中:添加.查询Groovy脚本,动态加载执行 第三步:多次修改表数据值,查看执行结果 5

  • Java Gradle项目中的资源正确获取方式

    引言 一个Java Gradle项目会涉及到资源的访问. 一般情况下会将当前项目所需的资源文件全部放置于resources文件夹下, 无论是main文件下的source code 还是test文件夹下的test code. 都或多或少的涉及到获取resources文件夹下的资源. 本文主要目的就是详细的总结一下如何获取resources文件夹下的资源. 两个getResource方法 来看一个简单的Java Gradle项目(称呼其为simpleresource)的项目结构 首先这个projec

  • Java中的Gradle与Groovy的区别及存在的关系

    目录 一.Gradle构建的利与弊 二.Groovy的优点 三.依存关系 四.认识build.gradle 五.Gradlebuildscript 六.什么是闭包 七.Gradle只是闭包 八.探索Gradle依赖项配置 九.打包Gradle版本 十.任务 前言: 在Java项目中,有两个主要的构建系统:Gradle和Maven.构建系统主要管理潜在的复杂依赖关系并正确编译项目.还可以将已编译的项目以及所有资源和源文件打包到.war或.jar文件中.对于简单的构建,Maven和Gradle之间的

  • Java 中执行动态表达式语句前中后缀Ognl、SpEL、Groovy、Jexl3

    目录 Ognl.SpEL.Groovy.Jexl3 一.前中后缀简单描述 1.前缀.中缀.后缀表达式(逆波兰表达式) 2.中缀表达式 3.后缀表达式 4.前缀表达式 二.OGNL 三.SpEL 四.Jexl/Jexl3 五.Groovy 六.扩展 Ognl.SpEL.Groovy.Jexl3 在一些规则集或者工作流项目中,经常会遇到动态解析表达式并执行得出结果的功能. 规则引擎是一种嵌入在应用程序中的组件,它可以将业务规则从业务代码中剥离出来,使用预先定义好的语义规范来实现这些剥离出来的业务规则

  • 如何使用gradle将java项目推送至maven中央仓库

    目录 一.注册Sonatype账号申请创建项目 二.等待Sonatype申请批复 三.生成GPG 四.配置gradle 五.Sonatype将项目同步至Maven中央仓库 一.注册Sonatype账号申请创建项目 到链接:https://issues.sonatype.org/注册一个账号. 创建点击顶部导航栏的 create 创建项目 如上填写,注意的是group id我这里使用的是gitee的二级域名地址,这个域名必须是真实的,与project url中的一致.或者自己有一个域名按照提示的链

  • 使用 Java 开发 Gradle 插件的步骤

    目录 1创建项目 2动手开发 3发布插件 3.1发布到Maven仓库 3.2发布到Gradle官方插件门户 4更多 4.1在插件中添加任务 4.2添加扩展 5小结 6参考内容 Gradle 插件代码可以在 build.gradle 中,buildSrc 项目中,以及独立的插件项目中编写.本文将介绍如何在一个独立的项目中使用 Java 语言编写 Gradle 插件,并发布到仓库中. 1 创建项目 Gradle 插件项目和普通的 Java 项目没有什么不同,普通项目是基于其它三方包进行开发,而 Gr

  • 详解如何使用Android Studio开发Gradle插件

    缘由 首先说明一下为什么会有这篇文章.前段时间,插件化以及热修复的技术很热,Nuwa热修复的工具NuwaGradle,携程动态加载技术DynamicAPK,还有希望做最轻巧的插件化框架的Small.这三个App有一个共同的地方就是大量的使用了Gradle这个强大的构建工具,除了携程的框架外,另外两个都发布了独立的Gradle插件提供自动化构建插件,或者生成热修复的补丁.所以学习一下Gradle插件的编写还是一件十分有意义的事. 插件类型 Gradle的插件一般有这么几种: 一种是直接在项目中的g

  • 微信小程序后端(java)开发流程的详细步骤

    微信小程序后端开发流程根据官网总结为两个步骤 1.前端调用 wx.login 返回了code,然后调用wx.getUserInfo获取到用户的昵称 头像 2.服务端根据code去微信获取openid, 接口地址: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html%EF%BC%9B%E5%90%8C%E6%97%B6%EF%BC%8C%E6%9B%B4

  • java开发微信分享接口的步骤

    微信分享接口的java开发的一些小步骤,具体内容如下 1.配置接口信息进行验证 代码如下: /** * 访问没认证的地址跳转 * * @param request * @return 登录页面 * @throws Exception */ @RequestMapping(value = "/checkWxDomainUrl", method = RequestMethod.GET) public void checkWxDomainUrl(HttpServletRequest requ

  • Android自定义Gradle插件的详细过程

    一.Gradle 我们知道在我们现在使用Android Stduio开发Android项目的时候,Android Studio是基于Gradle来帮助我们构建,管理项目的. Gradle:Gradle是一个项目构建工具,用来帮助我们管理项目的依赖.打包.发布.部署等工作. Gradle是通过如build.gradle这种gradle脚本来进行项目构建的,所以我们对项目的构建配置都是可以写在gradle构建脚本中. gradle构建脚本使用的是Groovy语言,Groovy语言也是一种jvm语言,

  • Android Studio调试Gradle插件详情

    前言: 使用ASM在编译期修改字节码来完成各种功能(统计方法耗时.全埋点统计...),就需要开发Gradle插件.开发插件中遇到问题排查使用日志输出效率太低了,能断点调试的话就更好了.其实已经有很多文章写了调试插件的方法,但是自己照着他们的步骤下来还是遇到一些问题,把这些问题记录下来方便大家少走弯路. Android Studio版本是3.5.2,Gradle版本是3.5.1 1.点击[Run]->[Edit Configurations...]: 2.然后点击左上角的[+],选择[Remote

  • Java开发环境配置及Vscode搭建过程

    目录 Java开发环境配置 Vscode中配置Java开发环境 Java开发环境配置 环境配置之前,首先使用cmd命令查看机器是否配置过Java环境,测试命令为(java或javac或java -version[java与-之间存在空格]) 若出现以上信息,说明已经配置好,无需重复操作!!!反之,进行下述操作. 在电脑中安装JDK,下载地址,进入后下滑显示界面 选择适合自己的版本进行下载,此处演示 Windows X64 Installer 下载.在Oracle官网下载涉及到账号注册,也可访问此

  • VSCode+Gradle搭建Java开发环境实现

    前言 其实目前已经有许多优秀的IDE都是支持JAVA开发的,比如Eclipse.NetBeans.IntelliJ IDEA.Android Studio等,如果是项目级的开发,并且对这些IDE也已经十分满意的话,可以不用再来折腾VSCode(Visual Studio Code).我本人主要是基于以下原因选择折腾一番: 确实是喜欢VSCode这款工具,开源免费,UI美观,性能强悍. 插件丰富,并且通过对各种插件的安装,也能对程序运行过程和原理有进一步了解,达到 "知其所以然" 的目的

  • IDEA配置java开发环境(maven、gradle、tomcat)

    idea安装好以后,是需要简单的配置一下的,而且要分不同的开发环境,此处就不多扩展了,我们就一起来配置java的开发环境 准备: 1.jdk环境配置 ------- java环境变量请参考(linux环境下java开发环境配置 或 windows环境下java开发环境配置) 2.maven build工具(maven项目使用),下载地址,本地下载地址 3.gradle build工具(gradle项目使用),下载地址,本地下载地址 4.tomcat 8.x ,下载地址,本地下载地址 内容: 一.

  • JAVA开发环境Vs code配置步骤详解

    目录 下载JDK 配置环境变量 安装完插件之后,打开code的“文件”-“首选项”-“设置”,进行参数设置,配置java和maven的路径,如下所示,配置完成就可以进行Java开发了. 点击settings.json,把下面的写进去. ("C:\\Program Files\\Java\\jdk1.8.0_172",)是你自己的jdk地址. "java.home": "C:\\Program Files\\Java\\jdk1.8.0_172",

随机推荐