1. 概要

入力パラメータを必要とするGradleからさまざまなプログラムを実行したい場合があります。

このクイックチュートリアルでは、Gradleからコマンドライン引数を渡す方法を説明します。

2. 入力引数の種類

Gradle CLIから入力引数を渡したい場合、2つの選択肢があります。

  • -Dフラグを使用したシステムプロパティの設定
  • -Pフラグを使用したプロジェクトプロパティの設定

一般に、 JVM の設定をカスタマイズする場合を除いて、プロジェクトのプロパティを使用する必要があります。

システムプロパティを乗っ取って入力を渡すことは可能ですが、これは避ける必要があります。

これらのプロパティの動作を見てみましょう。 まず、build.gradleを構成します。

apply plugin: "java"
description = "Gradle Command Line Arguments examples"

task propertyTypes(){
    doLast{
        if (project.hasProperty("args")) {
            println "Our input argument with project property ["+project.getProperty("args")+"]"
        }
        println "Our input argument with system property ["+System.getProperty("args")+"]"
    }
}

タスクでそれらを異なって読んでいることに注意してください。

これを行うのは、プロパティが定義されていない場合に project.getProperty()がMissingPropertyExceptionをスローするためです

プロジェクトのプロパティとは異なり、 System.getProperty()は、プロパティが定義されていない場合にnull値を返します。

次に、タスクを実行して、その出力を確認しましょう。

$ ./gradlew propertyTypes -Dargs=lorem -Pargs=ipsum

> Task :cmd-line-args:propertyTypes
Our input argument with project property [ipsum]
Our input argument with system property [lorem]

3. コマンドライン引数の受け渡し

これまで、プロパティの読み方を見てきました。 実際には、これらのプロパティを選択したプログラムへの引数として送信する必要があります。

3.1. Javaアプリケーションへの引数の受け渡し

前のチュートリアルでは、GradleからJavaメインクラスを実行する方法を説明しました。 その上に構築して、引数を渡す方法を見てみましょう。

まず、build.gradleでアプリケーションプラグインを使用しましょう。

apply plugin: "java"
apply plugin: "application"
description = "Gradle Command Line Arguments examples"
 
// previous declarations
 
ext.javaMainClass = "com.baeldung.cmd.MainClass"
 
application {
    mainClassName = javaMainClass
}

それでは、メインクラスを見てみましょう。

public class MainClass {
    public static void main(String[] args) {
        System.out.println("Gradle command line arguments example");
        for (String arg : args) {
            System.out.println("Got argument [" + arg + "]");
        }
    }
}

次に、いくつかの引数を使用して実行してみましょう。

$ ./gradlew :cmd-line-args:run --args="lorem ipsum dolor"

> Task :cmd-line-args:run
Gradle command line arguments example
Got argument [lorem]
Got argument [ipsum]
Got argument [dolor]

ここでは、引数を渡すためにプロパティを使用しません。 代わりに、 –argsフラグとそれに対応する入力を渡します。

これは、アプリケーションプラグインによって提供される優れたラッパーです。 ただし、これはGradle4.9以降でのみ使用できます。

これがJavaExecタスクを使用してどのように見えるかを見てみましょう。

まず、build.gradleで定義する必要があります。

ext.javaMainClass = "com.baeldung.cmd.MainClass"
if (project.hasProperty("args")) {
    ext.cmdargs = project.getProperty("args")
} else { 
    ext.cmdargs = ""
}
task cmdLineJavaExec(type: JavaExec) {
    group = "Execution"
    description = "Run the main class with JavaExecTask"
    classpath = sourceSets.main.runtimeClasspath
    main = javaMainClass
    args cmdargs.split()
}

私たちが何をしたかを詳しく見てみましょう。 最初にプロジェクトプロパティから引数を読み取ります。

これにはすべての引数が1つの文字列として含まれているため、splitメソッドを使用して引数の配列を取得します

次に、この配列をJavaExecタスクのargsプロパティに渡します。

-P オプションを使用してプロジェクトのプロパティを渡し、このタスクを実行するとどうなるか見てみましょう。

$ ./gradlew cmdLineJavaExec -Pargs="lorem ipsum dolor"

> Task :cmd-line-args:cmdLineJavaExec
Gradle command line arguments example
Got argument [lorem]
Got argument [ipsum]
Got argument [dolor]

3.2. 他のアプリケーションへの引数の受け渡し

場合によっては、Gradleからサードパーティアプリケーションにいくつかの引数を渡したいことがあります。

幸い、より一般的なExecタスクを使用してこれを行うことができます。

if (project.hasProperty("args")) {
    ext.cmdargs = project.getProperty("args")
} else { 
    ext.cmdargs = "ls"
}
 
task cmdLineExec(type: Exec) {
    group = "Execution"
    description = "Run an external program with ExecTask"
    commandLine cmdargs.split()
}

ここでは、タスクのcommandLineプロパティを使用して、任意の引数とともに実行可能ファイルを渡します。 ここでも、スペースに基づいて入力を分割します。

lsコマンドでこれを実行する方法を見てみましょう。

$ ./gradlew cmdLineExec -Pargs="ls -ll"

> Task :cmd-line-args:cmdLineExec
total 4
drwxr-xr-x 1 user 1049089    0 Sep  1 17:59 bin
drwxr-xr-x 1 user 1049089    0 Sep  1 18:30 build
-rw-r--r-- 1 user 1049089 1016 Sep  3 15:32 build.gradle
drwxr-xr-x 1 user 1049089    0 Sep  1 17:52 src

これは、タスクで実行可能ファイルをハードコーディングしたくない場合に非常に便利です。

4. 結論

このクイックチュートリアルでは、Gradleから入力引数を渡す方法を説明しました。

まず、使用できるプロパティの種類について説明しました。 システムプロパティを使用して入力引数を渡すことはできますが、代わりにプロジェクトプロパティを使用する必要があります。

次に、コマンドライン引数をJavaまたは外部アプリケーションに渡すためのさまざまなアプローチを検討しました。

いつものように、完全なコードはGitHubにあります。