5月27日 23:18
What are the types of Gradle plugins? How to create and use custom plugins?
Gradle plugins are the primary mechanism for extending Gradle functionality. Through plugins, you can add new tasks, configurations, and conventions. Here's a detailed explanation of Gradle plugins:
Plugin Types
1. Binary Plugins
Binary plugins are classes that implement the Plugin interface, typically packaged as JAR files.
groovy// Apply binary plugins plugins { id 'java' id 'org.springframework.boot' version '3.0.0' id 'com.android.application' version '8.0.0' }
2. Script Plugins
Script plugins are Groovy or Kotlin script files containing build logic.
groovy// Apply script plugins apply from: 'gradle/checkstyle.gradle' apply from: file('gradle/codenarc.gradle') apply from: new File(rootDir, 'gradle/common.gradle')
Ways to Apply Plugins
Using plugins DSL (Recommended)
groovyplugins { // Gradle core plugins (no version needed) id 'java' id 'application' id 'war' // Community plugins (version required) id 'org.springframework.boot' version '3.0.0' id 'com.github.spotbugs' version '5.0.14' id 'io.spring.dependency-management' version '1.1.0' // Using plugin ID id 'com.android.application' version '8.0.0' apply false }
Using apply Method (Old Way)
groovy// Apply core plugins apply plugin: 'java' apply plugin: 'application' // Apply community plugins apply plugin: 'org.springframework.boot' apply plugin: 'com.github.spotbugs' // Using classpath buildscript { repositories { mavenCentral() } dependencies { classpath 'org.springframework.boot:spring-boot-gradle-plugin:3.0.0' } } apply plugin: 'org.springframework.boot'
Common Plugins
Java Plugin
groovyplugins { id 'java' } // Tasks provided by Java plugin // - compileJava: Compile Java source code // - compileTestJava: Compile test code // - test: Run tests // - jar: Package JAR file // - javadoc: Generate Javadoc
Application Plugin
groovyplugins { id 'application' } application { mainClass = 'com.example.Main' applicationDefaultJvmArgs = ['-Xmx1024m'] } // Tasks provided // - run: Run application // - distZip: Create ZIP distribution // - distTar: Create TAR distribution // - installDist: Install application
War Plugin
groovyplugins { id 'war' } war { archiveFileName = 'myapp.war' webAppDirName = 'src/main/webapp' } // Tasks provided // - war: Create WAR file
Spring Boot Plugin
groovyplugins { id 'org.springframework.boot' version '3.0.0' } springBoot { mainClass = 'com.example.Application' } // Tasks provided // - bootRun: Run Spring Boot application // - bootJar: Create executable JAR // - bootWar: Create executable WAR
Custom Plugins
Create Plugin Project Structure
shellcustom-plugin/ ├── build.gradle ├── settings.gradle └── src/ └── main/ ├── groovy/ │ └── com/ │ └── example/ │ └── CustomPlugin.groovy └── resources/ └── META-INF/ └── gradle-plugins/ └── com.example.custom-plugin.properties
Implement Plugin Class
groovy// CustomPlugin.groovy package com.example import org.gradle.api.Plugin import org.gradle.api.Project class CustomPlugin implements Plugin<Project> { @Override void apply(Project project) { // Create extension def extension = project.extensions.create('customConfig', CustomExtension) // Create task def helloTask = project.tasks.register('hello') { group = 'Custom' description = 'Says hello' doLast { println "Hello, ${extension.name}!" } } // Configure project project.afterEvaluate { println "Project ${project.name} configured with custom plugin" } } } class CustomExtension { String name = 'World' int timeout = 30 void timeout(int timeout) { this.timeout = timeout } }
Define Plugin ID
properties# com.example.custom-plugin.properties implementation-class=com.example.CustomPlugin
Publish Plugin
groovy// build.gradle plugins { id 'java-gradle-plugin' id 'maven-publish' } gradlePlugin { plugins { customPlugin { id = 'com.example.custom-plugin' implementationClass = 'com.example.CustomPlugin' } } } publishing { repositories { maven { url = uri('../repo') } } }
Use Custom Plugin
groovy// Add plugin repository in settings.gradle pluginManagement { repositories { maven { url = uri('../repo') } gradlePluginPortal() } } // Apply plugin in build.gradle plugins { id 'com.example.custom-plugin' } customConfig { name = 'Gradle' timeout 60 }
Plugin Configuration
Plugin Block Configuration
groovyplugins { id 'java' id 'checkstyle' } checkstyle { toolVersion = '10.3' configFile = file('config/checkstyle/checkstyle.xml') ignoreFailures = false showViolations = true }
Extension Configuration
groovy// Use extensions provided by plugins java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 withSourcesJar() withJavadocJar() } test { useJUnitPlatform() testLogging { events 'passed', 'skipped', 'failed' } }
Plugin Dependency Management
Plugin Version Management
groovy// Use version catalog [plugins] spring-boot = { id = "org.springframework.boot", version = "3.0.0" } dependency-management = { id = "io.spring.dependency-management", version = "1.1.0" } // Use in build.gradle plugins { id libs.plugins.spring.boot.get().pluginId id libs.plugins.dependency.management.get().pluginId }
Plugin Dependency Resolution Strategy
groovysettings.gradle { pluginManagement { repositories { gradlePluginPortal() mavenCentral() google() } resolutionStrategy { eachPlugin { if (requested.id.id == 'com.example.plugin') { useModule('com.example:plugin:1.0.0') } } } } }
Best Practices
- Use plugins DSL: Prefer using
pluginsDSL overapplymethod - Specify plugin versions: Specify clear version numbers for community plugins
- Use plugins appropriately: Only apply necessary plugins to avoid feature redundancy
- Custom plugins: Consider creating custom plugins for repetitive build logic
- Plugin configuration: Configure plugin extensions immediately after applying plugins
- Plugin dependencies: Be aware of dependencies between plugins to avoid conflicts
- Plugin updates: Regularly check and update plugin versions for new features and fixes