1. 序章

Gradleは非常に人気のあるビルドツールであり、高度にカスタマイズ可能なビルドプロセスで高く評価されています。

今日は、カスタムGradleプラグインを作成する方法を紹介します。これにより、標準構成で達成できる以上にビルドプロセスを変更できます。

2. プラグインのソースの場所

コードをいくつかの異なる場所に配置できます。 それらのすべてには、いくつかの長所と短所があります。

2.1. スクリプトを作成する

プラグインのソースコードをビルドスクリプト自体の中に入れるだけです。 これにより、プラグインの自動コンパイルとインクルードが可能になります。

非常にシンプルですが、プラグインはビルドスクリプトの外部には表示されません。そのため、他のビルドスクリプトでプラグインを再利用することはできません。

2.2. BuildSrcフォルダー

使用できるもう1つの可能性は、プラグインのソースコードを buildSrc / src / main /javaフォルダーに配置することです。

Gradleを実行すると、buildSrcフォルダーの存在が確認されます。 それが存在する場合、Gradleは自動的にプラグインをビルドして含めます。

これにより、さまざまなビルドスクリプト間でプラグインを共有できるようになりますが、それでも他のプロジェクトで使用することはできません。

2.3. スタンドアロンプロジェクト

最後に、プラグインを別のプロジェクトとして作成して、プラグインをさまざまなプロジェクトで完全に再利用できるようにすることができます。

ただし、外部プロジェクトで使用するには、jarファイルにバンドルしてプロジェクトに追加する必要があります。

3. 私たちの最初のプラグイン

基本から始めましょう– すべてのGradleプラグインは、com.gradle.api.Pluginインターフェースを実装する必要があります。

インターフェイスは汎用であるため、さまざまなパラメータタイプでパラメータ化できます。 通常、パラメータタイプはorg.gradle.api.Project。です。

ただし、プラグインがさまざまなライフタイムフェーズで適用されるように、さまざまなタイプのパラメーターを使用できます。

  • org.gradle.api.Settings を使用すると、プラグインが設定スクリプトに適用されます
  • org.gradle.api.Gradle を使用すると、プラグインが初期化スクリプトに適用されます

作成できる最も単純なプラグインは、 helloworldアプリケーションです。

public class GreetingPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        project.task("hello")
          .doLast(task -> System.out.println("Hello Gradle!"));
    }
}

これで、ビルドスクリプト内に行を追加して適用できます。

apply plugin: GreetingPlugin

これで、 gradle hello、を呼び出した後、ログに「HelloGradle」メッセージが表示されます。

4. プラグインの構成

ほとんどのプラグインは、ビルドスクリプトから外部構成にアクセスする必要があります。

拡張オブジェクトを使用してこれを行うことができます。

public class GreetingPluginExtension {
    private String greeter = "Baeldung";
    private String message = "Message from the plugin!"
    // standard getters and setters
}

次に、新しい拡張オブジェクトをプラグインクラスに追加しましょう。

@Override
public void apply(Project project) {
    GreetingPluginExtension extension = project.getExtensions()
      .create("greeting", GreetingPluginExtension.class);

    project.task("hello")
      .doLast(task -> {
          System.out.println(
            "Hello, " + extension.getGreeter());
          System.out.println(
            "I have a message for You: " + extension.getMessage());
      });
}

今、私たちが呼び出すとき gradleこんにちは、 で定義されているデフォルトのメッセージが表示されます GreetingPluginExtension。

ただし、拡張機能を作成したので、クロージャーを使用してビルドスクリプト内でそれを行うことができます。

greeting {
    greeter = "Stranger"
    message = "Message from the build script" 
}

5. スタンドアロンプラグインプロジェクト

スタンドアロンのGradleプラグインを作成するには、もう少し作業を行う必要があります。

5.1. 設定

まず、GradleAPIの依存関係をインポートする必要があります。これは非常に簡単です。

dependencies {
    compile gradleApi()
}

Mavenで同じことを行うには、Gradleリポジトリからのgradle-tooling-api依存関係が必要であることに注意してください。

<dependencies>
    <dependency>
        <groupId>org.gradle</groupId>
        <artifactId>gradle-tooling-api</artifactId>
        <version>3.0</version>
    </dependency>
    <dependency>
        <groupId>org.gradle</groupId>
        <artifactId>gradle-core</artifactId>
        <version>3.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
<repositories>
    <repository>
        <id>repo.gradle.org</id>
        <url>https://repo.gradle.org/gradle/libs-releases-local/</url>
    </repository>
</repositories>

5.2. プラグインの配線

Gradleがスタンドアロンプラグインの実装を見つけられるようにするには、 src / main / resources / META-INF / gradle -pluginsにプロパティファイルを作成する必要があります。

リソースファイルには、プラグインIDと一致する名前を付ける必要があります。 したがって、プラグインのIDがorg.baeldung.greetingの場合、ファイルの正確なパスはMETA-INF / gradle-plugins/org.baeldung.greeting.propertiesになります。

次に、プラグインの実装クラスを定義できます。

    implementation-class=org.gradle.GreetingPlugin

implementation-class は、プラグインクラスの完全なパッケージ名と同じである必要があります。

5.3. プラグインIDの作成

プラグインIDがGradleで従わなければならないいくつかのルールと規則があります。 それらのほとんどは、Javaのパッケージ名ルールに似ています。

  • 英数字「。」のみを含めることができます。 と “-“
  • IDには少なくとも1つの「。」が必要です。 ドメイン名をプラグイン名から分離する
  • 名前空間org.gradleおよびcom.gradlewareは制限されています
  • IDは「。」で開始または終了することはできません。
  • 2つ以上の連続した「。」はありません。 文字は許可されます

最後に、プラグインIDは、逆ドメイン名の規則に従う小文字の名前にする必要があるという規則があります。

Javaパッケージ名とGradleプラグイン名の主な違いは、パッケージ名は通常、プラグインIDよりも詳細であるということです。

5.4. 公開プラグイン

プラグインを公開して外部プロジェクトで再利用できるようにする場合、それを実現する方法は2つあります。

まず、プラグインJARをMavenやIvyなどの外部リポジトリに公開できます。

または、Gradleプラグインポータルを使用することもできます。 これにより、幅広いGradleコミュニティからプラグインにアクセスできるようになります。 Gradleリポジトリへのプロジェクトの公開の詳細については、Gradleプラグインポータルのドキュメントをご覧ください。

5.5. JavaGradle開発プラグイン

Javaでプラグインを作成しているときは、 JavaGradle開発プラグイン。

これにより、 gradleApi()の依存関係が自動的にコンパイルおよび追加されます。 また、 gradlejarタスクの一部としてプラグインメタデータの検証も実行します。

ビルドスクリプトに次のブロックを追加することで、プラグインを追加できます。

plugins {
    id 'java-gradle-plugin'
}

6. プラグインのテスト

プラグインが正しく機能し、プロジェクトに適切に適用されていることをテストするには、 org.gradle.testfixtures.ProjectBuilderを使用してProjectのインスタンスを作成できます。 。

次に、プラグインが適用され、プロジェクトインスタンスに適切なタスクが存在するかどうかを確認できます。 これを行うには、標準のJUnitテストを使用できます。

@Test
public void greetingTest(){
    Project project = ProjectBuilder.builder().build();
    project.getPluginManager().apply("com.baeldung.greeting");
 
    assertTrue(project.getPluginManager()
      .hasPlugin("com.baeldung.greeting"));
 
    assertNotNull(project.getTasks().getByName("hello"));
}

7. 概要

この記事では、Gradleでカスタムプラグインを作成するための基本を説明しました。 プラグインの作成についてさらに詳しく知るには、Gradleドキュメントをご覧ください。

そして、いつものように、すべてのコードサンプルはGithubにあります。