Skip to content

插件开发基础

Gradle 插件允许将可复用的构建逻辑打包成独立单元,供多个项目使用。

插件的三种形式

形式位置适用场景
脚本插件.gradle.kts 文件简单的脚本共享
buildSrc 插件buildSrc/ 目录项目内共享
独立插件独立项目跨项目共享、发布

最简单的插件

kotlin
// buildSrc/src/main/kotlin/MyPlugin.kt
import org.gradle.api.Plugin
import org.gradle.api.Project

class MyPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        project.tasks.register("myPluginTask") {
            group = "my-plugin"
            description = "由 MyPlugin 注册的任务"
            doLast {
                println("Hello from MyPlugin!")
            }
        }
    }
}
kotlin
// 使用
plugins {
    id("MyPlugin")
}
// 或者
apply<MyPlugin>()

带配置的插件(Extension)

kotlin
// buildSrc/src/main/kotlin/GreetPlugin.kt
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.provider.Property

abstract class GreetExtension {
    abstract val greeting: Property<String>
    abstract val target: Property<String>
    
    init {
        greeting.convention("Hello")
        target.convention("World")
    }
}

class GreetPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        // 创建 Extension
        val extension = project.extensions.create("greet", GreetExtension::class.java)
        
        // 注册使用 Extension 配置的任务
        project.tasks.register("greet") {
            group = "greet"
            doLast {
                println("${extension.greeting.get()}, ${extension.target.get()}!")
            }
        }
    }
}
kotlin
// 使用插件
apply<GreetPlugin>()

greet {
    greeting = "Hi"
    target = "Gradle"
}

约定插件(Precompiled Script Plugin)

约定插件是最推荐的方式,使用 .gradle.kts 文件定义:

kotlin
// buildSrc/src/main/kotlin/java-conventions.gradle.kts
plugins {
    java
}

java {
    sourceCompatibility = JavaVersion.VERSION_17
}

tasks.withType<JavaCompile> {
    options.encoding = "UTF-8"
}

tasks.withType<Test> {
    useJUnitPlatform()
}
kotlin
// 子项目 build.gradle.kts
plugins {
    id("java-conventions")  // 插件 ID = 文件名
}

插件 ID 规则

插件 ID 必须是:

  • 小写字母、数字和 -
  • 通常使用反向域名:com.example.my-plugin
  • buildSrc 约定插件 ID = 文件名(不含扩展名)

下一步