使用 Java 開發 Gradle 外掛
阿新 • • 發佈:2021-03-03
Gradle 外掛程式碼可以在 build.gradle 中,buildSrc 專案中,以及獨立的外掛專案中編寫。本文將介紹如何在一個獨立的專案中使用 Java 語言編寫 Gradle 外掛,併發布到倉庫中。
## 1 建立專案
Gradle 外掛專案和普通的 Java 專案沒有什麼不同,普通專案是基於其它三方包進行開發,而 Gradle 外掛專案基於 Gradle 的 API 進行開發。
基於 Gradle 建立一個 Java 專案,專案目錄結構如下,和普通專案一樣。
```bash
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
```java
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](https://docs.gradle.org/current/userguide/tutorial_using_tasks.html#sec:projects_and_tasks) (可以認為是 build.gralde, 它本質是一個實現了 Project 介面的類)所引用。開發外掛的本質就是往 build.gradle 中插入一段邏輯。
```java
void apply(T target)
```
Plugin 是一個泛型介面,有一個抽象方法 apply,它的引數型別可以是 [Project](https://docs.gradle.org/current/dsl/org.gradle.api.Project.html), [Settings](https://docs.gradle.org/current/dsl/org.gradle.api.initialization.Settings.html), 或者 [Gradle](https://docs.gradle.org/current/dsl/org.gradle.api.invocation.Gradle.html)。
- 型別為 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
```java
import org.gradle.api.Plugin;
import org.gradle.api.Project;
public class HelloPlugin implements Plugin {
@Override
public void apply(Project project) {
System.out.println("Message from hello plugin.");
}
}
```
GoodbyePlugin.java
```java
import org.gradle.api.Plugin;
import org.gradle.api.Project;
public class GoodbyePlugin implements Plugin {
@Override
public void apply(Project project) {
System.out.println("Message from goodbye plugin.");
}
}
```
2)在 build.gradle 中新增描述內容
描述內容需要指定外掛的 ID 和外掛的入口類。
```groovy
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 外掛
```groovy
plugins {
id 'java-gradle-plugin'
id 'maven-publish'
}
```
2)執行 `gradle publishToMavenLocal`,成功之後可以在 `~/.m2` 目錄下找打發布的 jar 包。
要使用釋出到 Maven 倉庫中的 Gradle 外掛,需要先在 settings.gradle 中指定倉庫。如下程式碼指定了外掛倉庫有本地 Maven 和 Gradle 外掛門戶。
```groovy
pluginManagement {
repositories {
mavenLocal()
gradlePluginPortal()
}
}
```
### 3.2 釋出到 Gradle 官方外掛門戶
我們平常使用的大部分外掛來自於 Gradle 官方外掛門戶,開發人員註冊一個 Gradle 賬號之後可以將外掛釋出到門戶,這樣其他人就可以很方便地使用了。按照如下步驟釋出外掛,這裡如果沒有描述清楚可以移步 Gradle 官網文件:[How do I add my plugin to the plugin portal?](https://plugins.gradle.org/docs/submit)。
1)註冊門戶賬戶
2)建立 API Key。註冊好賬戶就能夠看見了。
3)將 API Key 新增到檔案 `~/.gradle/gradle.properties`
4)使用外掛釋出外掛 com.gradle.plugin-publish 釋出外掛(不是病句,只是有點繞