web-dev-qa-db-ja.com

Gradleタスク-Javaアプリケーションに引数を渡します

カスタムgradleタスクで実行するJavaアプリケーションがあり、そのアプリケーションを呼び出すにはいくつかの引数が必要です。これらは:

programName ( string | -f filename | -d key | -h)
Options:
    string         Message to be used.
    -d key         Use default messages, key must be s[hort], m[edium] or l[ong].
    -f filename    Use specified file as input.
    -h             Help dialog.

Gradleタスクは次のようになります。

task run (type: JavaExec){
    description = "Secure algorythm testing"
    main = 'main.Test'
    classpath = sourceSets.main.runtimeClasspath
}

gradle run -hを実行しようとしましたが、機能しません。

90
RecuencoJones

Gradle 4.9以降、コマンドライン引数は--argsで渡すことができます。たとえば、コマンドライン引数foo --barを使用してアプリケーションを起動する場合は、次を使用できます。

gradle run --args = 'foo --bar'

Gradle Applicationプラグインも参照

Gradleラッパーのアップグレード方法

40
AMing

更新:
Gradle 4.9は、コマンドライン引数の受け渡しをより適切にサポートします。例:

gradle run --args='arg1 arg2'

Pre-Gradle 4.9では、次をbuild.gradleに追加します。

run {
    if (project.hasProperty("appArgs")) {
        args Eval.me(appArgs)
    }
}

次に実行するには:gradle run -PappArgs="['arg1', 'args2']"

84
xlm

遅刻してごめんなさい。

私は@xlmに似た答えを考えました:

task run (type: JavaExec, dependsOn: classes){
    if(project.hasProperty('myargs')){
        args(myargs.split(','))
    }
    description = "Secure algorythm testing"
    main = "main.Test"
    classpath = sourceSets.main.runtimeClasspath
}

そして次のように呼び出します:

gradle run -Pmyargs=-d,s
27
RecuencoJones

常に同じ引数セットを使用する場合、必要なものは次のとおりです。

run {
    args = ["--myarg1", "--myarg2"]
}
20
Claudio Fahey

Gradle経由でJavaクラスを実行するときにシステムプロパティとパラメーターを渡す問題 で解決策を見つけることができます。両方ともargsプロパティの使用を伴います

また、-Dで渡すことと-Pで渡すことの違いを読む必要があります Gradleドキュメントで

もちろん、上記の答えはすべて仕事をしますが、それでも私は次のようなものを使いたいです

gradle run path1 path2

まあこれはできませんが、できるとしたら:

gralde run --- path1 path2

あなたがそれがよりエレガントだと思うなら、あなたはそれを行うことができます、トリックはコマンドラインを処理し、gradleが行う前にそれを変更することです、これは init scripts を使用して行うことができます

以下のinitスクリプト:

  1. コマンドラインを処理し、---および「---」に続く他のすべての引数を削除します
  2. プロパティ「appArgs」をgradle.extに追加します

したがって、実行タスク(またはJavaExec、Exec)では次のことができます。

if (project.gradle.hasProperty("appArgs")) {
                List<String> appArgs = project.gradle.appArgs;

                args appArgs

 }

Initスクリプトは次のとおりです。

import org.gradle.api.invocation.Gradle

Gradle aGradle = gradle

StartParameter startParameter = aGradle.startParameter

List tasks = startParameter.getTaskRequests();

List<String> appArgs = new ArrayList<>()

tasks.forEach {
   List<String> args = it.getArgs();


   Iterator<String> argsI = args.iterator();

   while (argsI.hasNext()) {

      String arg = argsI.next();

      // remove '---' and all that follow
      if (arg == "---") {
         argsI.remove();

         while (argsI.hasNext()) {

            arg = argsI.next();

            // and add it to appArgs
            appArgs.add(arg);

            argsI.remove();

        }
    }
}

}


   aGradle.ext.appArgs = appArgs

制限事項:

  1. 「-」ではなく「---」を使用せざるを得なかった
  2. グローバル初期化スクリプトを追加する必要があります

グローバル初期化スクリプトが気に入らない場合は、コマンドラインで指定できます

gradle -I init.gradle run --- f:/temp/x.xml

または、シェルにエイリアスを追加することをお勧めします。

gradleapp run --- f:/temp/x.xml
5
Boaz Nahum

以下のようなプロジェクトプロパティを使用して、argsとしてタスクに渡す必要があります。

args = [project.property('h')]

タスク定義に追加( dsl docs を参照)

その後、次のように実行できます。

gradle -Ph run
2
cjstehno