使用 Java 開發(fā) Gradle 插件的步驟
Gradle 插件代碼可以在 build.gradle 中,buildSrc 項(xiàng)目中,以及獨(dú)立的插件項(xiàng)目中編寫。本文將介紹如何在一個(gè)獨(dú)立的項(xiàng)目中使用 Java 語言編寫 Gradle 插件,并發(fā)布到倉庫中。
1 創(chuàng)建項(xiàng)目
Gradle 插件項(xiàng)目和普通的 Java 項(xiàng)目沒有什么不同,普通項(xiàng)目是基于其它三方包進(jìn)行開發(fā),而 Gradle 插件項(xiàng)目基于 Gradle 的 API 進(jìn)行開發(fā)。
基于 Gradle 創(chuàng)建一個(gè) Java 項(xiàng)目,項(xiàng)目目錄結(jié)構(gòu)如下,和普通項(xiàng)目一樣。
gradle-plugin-sample | ├───build.gradle ├───settings.gradle └───src ├───main │ ├───java │ └───resources └───test ├───java └───resources
引入 Gradle API 相關(guān)的 jar 包。為了方便起見,可以通過 gradle 插件 java-gradle-plugin 來引入 Java 插件,引入 Gradle API 相關(guān)依賴以及生成插件相關(guān)的描述符。
build.gradle
plugins { id 'java-gradle-plugin' } group 'com.robothy' version '1.0-SNAPSHOT' repositories { mavenLocal() mavenCentral() } wrapper{ gradleVersion = '6.7' }
2 動(dòng)手開發(fā)
項(xiàng)目創(chuàng)建好之后,就可以開始動(dòng)手開發(fā)了。從項(xiàng)目構(gòu)建角度來看,Gradle 插件是一段可重用的構(gòu)建邏輯,這段邏輯能夠被應(yīng)用到各個(gè)項(xiàng)目當(dāng)中。更具體來說,Gradle 插件是一個(gè)實(shí)現(xiàn)了 org.gradle.api.Plugin 接口的類,它被 Project (可以認(rèn)為是 build.gralde, 它本質(zhì)是一個(gè)實(shí)現(xiàn)了 Project 接口的類)所引用。開發(fā)插件的本質(zhì)就是往 build.gradle 中插入一段邏輯。
void apply(T target)
Plugin 是一個(gè)泛型接口,有一個(gè)抽象方法 apply,它的參數(shù)類型可以是 Project, Settings, 或者 Gradle。
- 類型為 Project,插件可以應(yīng)用于 build.gradle;
- 類型為 Settings,插件可應(yīng)用于 settings.gradle;
- 類型為 Gradle, 插件可應(yīng)用于 Gradle 初始化腳本。
在應(yīng)用插件時(shí),gradle 會(huì)創(chuàng)建一個(gè)插件類的實(shí)例,并調(diào)用 apply 方法。因此,插件的邏輯就是 apply 方法中的代碼。
一個(gè)獨(dú)立的項(xiàng)目中可以有多個(gè)實(shí)現(xiàn)了 Plugin 接口的類,意味著一個(gè)項(xiàng)目可以包含多個(gè)插件。每一個(gè)插件都需要在 build.gradle 中添加相應(yīng)的描述,java-gradle-plugin 會(huì)根據(jù)這些描述生成插件描述符(jar 包中的一個(gè)文件)。
假設(shè)要在 gradle-plugin-sample 項(xiàng)目中創(chuàng)建兩個(gè)插件 hello, goodbye,需要進(jìn)行如下兩個(gè)步驟:
1)創(chuàng)建插件類
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 中添加描述內(nèi)容
描述內(nèi)容需要指定插件的 ID 和插件的入口類。
gradlePlugin { plugins { helloPlugin { id = 'com.robothy.hello' implementationClass = 'com.robothy.HelloPlugin' } googbyePlugin{ id = 'com.robothy.goodbye' implementationClass = 'com.robothy.GoodbyePlugin' } } }
完成上面步驟之后,一個(gè)簡(jiǎn)單的插件就算完成了開發(fā),接下來就可以發(fā)布和使用了。
3 發(fā)布插件
插件可以發(fā)布到 Maven 倉庫和 Gradle 官方插件門戶。
3.1 發(fā)布到 Maven 倉庫
發(fā)布插件到 Maven 倉庫和發(fā)布普通的 jar 包一樣,需要用到 maven-publish 插件。要發(fā)布到遠(yuǎn)程 Maven 倉庫可能需要提供認(rèn)證信息,這里簡(jiǎn)單起見只發(fā)布到本地倉庫。
1)在 build.gradle 文件中添加 maven-publish 插件
plugins { id 'java-gradle-plugin' id 'maven-publish' }
2)執(zhí)行 gradle publishToMavenLocal
,成功之后可以在 ~/.m2
目錄下找打發(fā)布的 jar 包。
要使用發(fā)布到 Maven 倉庫中的 Gradle 插件,需要先在 settings.gradle 中指定倉庫。如下代碼指定了插件倉庫有本地 Maven 和 Gradle 插件門戶。
pluginManagement { repositories { mavenLocal() gradlePluginPortal() } }
3.2 發(fā)布到 Gradle 官方插件門戶
我們平常使用的大部分插件來自于 Gradle 官方插件門戶,開發(fā)人員注冊(cè)一個(gè) Gradle 賬號(hào)之后可以將插件發(fā)布到門戶,這樣其他人就可以很方便地使用了。按照如下步驟發(fā)布插件,這里如果沒有描述清楚可以移步 Gradle 官網(wǎng)文檔:How do I add my plugin to the plugin portal?。
1)注冊(cè)門戶賬戶
2)創(chuàng)建 API Key。注冊(cè)好賬戶就能夠看見了。
3)將 API Key 添加到文件 ~/.gradle/gradle.properties
4)使用插件發(fā)布插件 com.gradle.plugin-publish 發(fā)布插件(不是病句,只是有點(diǎn)繞 😔)
將 com.gradle.plugin-publish 添加到插件項(xiàng)目 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' 可以省略,因?yàn)樵?gradlePlugin 配置塊中已經(jīng)有 id 信息了 displayName = 'Hello Plugin' } } }
5)使用 gradle publishPlugins 發(fā)布插件
如果插件信息描述正確,執(zhí)行 puhlishPlugins 任務(wù)之后會(huì)打印出待審核的信息,之后就是等待了(本人發(fā)布的插件 com.robothy.cn-repo 經(jīng)過了四五個(gè)小時(shí)就審核通過了)。
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 在插件中添加任務(wù)
先自定義一個(gè) Gradle 任務(wù)類 SayHelloTask,該任務(wù)的行為是簡(jiǎn)答的打印固定的字符串。自定義任務(wù)需要繼承 DefaultTask。
public class SayHelloTask { @TaskAction public void hello() { System.out.println("Hello, World!"); } }
然后通過 project 往項(xiàng)目中注冊(cè)一個(gè) SayHelloTask 的實(shí)例,任務(wù)名為 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); } }
當(dāng)然,也可以在使用 HelloPlugin 插件的 build.gradle 中注冊(cè)任務(wù)。
task hello(type: com.robothy.SayHelloTask)
重新發(fā)布插件,執(zhí)行下面命令時(shí)控制臺(tái)會(huì)打印出 "Hello, World!"。
gradle hello
4.2 添加擴(kuò)展
Gradle 插件可以往 project 中注冊(cè)擴(kuò)展,開發(fā)人員可以通過擴(kuò)展設(shè)置一些參數(shù)值,以供其它的 Gradle Task 使用。假設(shè)我們希望在 build.gradle 中添加如下配置信息。
user { name = 'Robothy' country = 'China' }
首先,創(chuàng)建一個(gè)配置信息接口,接口中只包含 getter 抽象方法。需要注意的是,返回的類型為 Property,并非直接返回 String。配置信息不需要?jiǎng)?chuàng)建為 Java 類,Gradle 在運(yùn)行時(shí)會(huì)通過動(dòng)態(tài)代理的方式自動(dòng)往代理對(duì)象中注入值。
public interface User { Property<String> getName(); Property<String> getCountry(); }
然后插件就可以往 project 中添加一個(gè)擴(kuò)展了。
project.getExtensions().add("user", User.class);
重新發(fā)布插件,此時(shí)引入了插件的項(xiàng)目就可以在 builde.gradle 中添加本小節(jié)開頭描述的配置塊了。
Gradle 任務(wù)可以通過如下方式訪問到這些配置信息。
User user = (User) (project.getExtensions().getByName("user"));
5 小結(jié)
本文主要介紹了如何使用純 Java 語言在一個(gè)獨(dú)立的項(xiàng)目中編寫 Gradle 插件,插件主要通過通過傳入的 project 參數(shù)訪問項(xiàng)目,往項(xiàng)目的構(gòu)建生命周期中插入一些邏輯或者添加配置信息。插件可以發(fā)布到私有的 Maven 倉庫,也可以發(fā)布到 Gradle 插件門戶。插件項(xiàng)目中還可以很好地封裝一些 Gradle Task,定義一些配置類型。
6 參考內(nèi)容
[2] How do I add my plugin to the plugin portal?
[3] Developing Custom Gradle Plugins
以上就是使用 Java 開發(fā) Gradle 插件的步驟的詳細(xì)內(nèi)容,更多關(guān)于Java 開發(fā) Gradle 插件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot下添加全局異常處理和自定義異常處理的過程解析
在spring項(xiàng)目中,優(yōu)雅處理異常,好處是可以將系統(tǒng)產(chǎn)生的全部異常統(tǒng)一捕獲處理,自定義的異常也由全局異常來捕獲,如果涉及到validator參數(shù)校驗(yàn)器使用全局異常捕獲也是較為方便,這篇文章主要介紹了springboot下添加全局異常處理和自定義異常處理,需要的朋友可以參考下2023-12-12Springboot實(shí)現(xiàn)Activemq死信隊(duì)列詳解
這篇文章主要介紹了Springboot實(shí)現(xiàn)Activemq死信隊(duì)列詳解,Activemq服務(wù)端配置重新投遞次數(shù)超過?MaximumRedeliveries?,則會(huì)進(jìn)入死信隊(duì)列,默認(rèn)情況,有一個(gè)死信隊(duì)列:AcitveMQ.DLQ,所有的消息都投遞到此隊(duì)列,包括過期消息,重投遞失敗消息,需要的朋友可以參考下2023-12-12MyBatis 如何配置多個(gè)別名 typeAliasesPackage
這篇文章主要介紹了MyBatis 如何配置多個(gè)別名 typeAliasesPackage,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Spring 使用Validation 驗(yàn)證框架的問題詳解
Spring Boot在內(nèi)部通過集成hibernate-validation已經(jīng)實(shí)現(xiàn)了JSR-349驗(yàn)證規(guī)范接口,在Spring Boot項(xiàng)目中只要直接使用就行了。 一般用在Controller中用于驗(yàn)證前端傳來的參數(shù)。這篇文章給大家介紹Spring Validation 驗(yàn)證框架的相關(guān)知識(shí),感興趣的朋友一起看看吧2021-07-07Spring Boot前后端分離開發(fā)模式中的跨域問題及解決方法
本文介紹了解決Spring Boot前端Vue跨域問題的實(shí)戰(zhàn)經(jīng)驗(yàn),并提供了后端和前端的配置示例,通過配置后端和前端,我們可以輕松解決跨域問題,實(shí)現(xiàn)正常的前后端交互,需要的朋友可以參考下2023-09-09JVM性能調(diào)優(yōu)實(shí)戰(zhàn):讓你的IntelliJ Idea縱享絲滑
這篇文章主要介紹了JVM性能調(diào)優(yōu)實(shí)戰(zhàn):讓你的IntelliJ Idea縱享絲滑的相關(guān)資料,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01