# Gradle Plugin Development Plugin

The Java Gradle Plugin development plugin can be used to assist in the development of Gradle plugins. It automatically applies the Java plugin, adds the `gradleApi()` dependency to the compile configuration and performs validation of plugin metadata during `jar` task execution.

The plugin also integrates with TestKit, a library that aids in writing and executing functional tests for plugin code. It automatically adds the `gradleTestKit()` dependency to the test compile configuration and generates a plugin classpath manifest file consumed by a `GradleRunner` instance if found. Please refer to Automatic classpath injection with the Plugin Development Plugin for more on its usage, configuration options and samples.

## Usage

To use the Java Gradle Plugin Development plugin, include the following in your build script:

Example 1. Using the Java Gradle Plugin Development plugin
build.gradle

    plugins {
        id 'java-gradle-plugin'
    }

build.gradle.kts

    plugins {
        `java-gradle-plugin`
    }

Applying the plugin automatically applies the Java plugin and adds the `gradleApi()` dependency to the compile configuration. It also adds some validations to the build.

The following validations are performed:

- There is a plugin descriptor defined for the plugin.

- The plugin descriptor contains an `implementation-class` property.

- The `implementation-class` property references a valid class file in the jar.

- Each property getter or the corresponding field must be annotated with a property annotation like `@InputFile` and `@OutputDirectory`. Properties that don’t participate in up-to-date checks should be annotated with `@Internal`.

Any failed validations will result in a warning message.

For each plugin you are developing, add an entry to the `gradlePlugin {}` script block:

Example 2. Using the gradlePlugin {} block.
build.gradle

    gradlePlugin {
        plugins {
            simplePlugin {
                id = 'org.gradle.sample.simple-plugin'
                implementationClass = 'org.gradle.sample.SimplePlugin'
            }
        }
    }

build.gradle.kts

    gradlePlugin {
        plugins {
            create("simplePlugin") {
                id = "org.gradle.sample.simple-plugin"
                implementationClass = "org.gradle.sample.SimplePlugin"
            }
        }
    }

The `gradlePlugin {}` block defines the plugins being built by the project including the `id` and `implementationClass` of the plugin. From this data about the plugins being developed, Gradle can automatically:

- Generate the plugin descriptor in the `jar` file’s `META-INF` directory.

- Configure the Maven or Ivy Publish Plugins publishing plugins to publish a Plugin Marker Artifact for each plugin.

- Moreover, if the Plugin Publishing Plugin is applied, it will publish each plugin using the same name, plugin id, display name, and description to the Gradle Plugin Portal (see Publishing Plugins to Gradle Plugin Portal for details).