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


127

カスタム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してみましたが動作しません。


答えはあなたのニーズに合いましたか?その場合は、1つをソリューションとしてマークする必要があります。
フランシスコJ.ロペスペリサー2014

1
実際には...友人と私はそれを行う方法を発見しましたが、まだ明確にしていないため、ソリューションを公開するために、両方の提案されたソリューションを試してみました。 tは本当に機能しているようです...
RecuencoJones 2014

@ 6uitar6reat6od最後にどうやって解決しましたか?また、gradleのバージョンは何ですか?
xlm 2015

回答:


80

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

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

参照Gradleアプリケーションプラグイン

Gradleラッパーをアップグレードする方法


1
'は期待されたものですか、それともタイプミスですか?すべての引数を一重引用符で区切られた文字列として渡す必要がありますか?
RecuencoJones 2018

@RecuencoJonesdocs.gradle.org/ current
Drew Stephens

1
Gradleの実行--args = 'FOO --bar'
ジム・洪水

3
'foo --bar'紛らわしいので、を使用しないでください'foo bar'
Eric Wang

4
@EricWangこれらはプログラムが必要とするかもしれない任意のコマンドライン引数です。生の文字列がビルドされたアプリケーションに渡されるため、gradleがあらゆる種類の引数をサポートすることを示すのは素晴らしいことです。
ジョフリー

100

Gradle 4.9以降

gradle run --args='arg1 arg2'

これはbuild.gradleアプリケーションプラグインで設定されていることを前提としています。あなたbuild.gradleはこれに似ているはずです:

plugins {
  // Implicitly applies Java plugin
  id: 'application'
}

application {
  // URI of your main class/application's entry point (required)
  mainClassName = 'org.gradle.sample.Main'
}

Pre-Gradle 4.9

次のものをに含めますbuild.gradle

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

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


7
この回答は役に立っただけでなく、最も簡単でした。
Jossie Calderon

更新の更新:gradle run --args 'arg1 arg2'うまくいきませんでした。私はしなければなりませんgradle run --args='arg1 arg2'
でした

@cmyersキャッチしてくれてありがとう!アップデートを更新しました
xlm

28

遅くなってすみません。

私は@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

28

常に同じ引数のセットを使用したい場合は、以下が必要です。

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

2
OK、私のような絶対的な初心者の場合:実行タスクを定義できるようにするには、build.gradleに次の2行が含まれている必要があります。 buuild.gradleでrunメソッド
MK ...

1
私はid 'application'プラグインを使用していますが、これが私が必要とする答えでした(動作します)。
ビッグリッチ

6

解決策は、Gradleを介してJavaクラスを実行するときにシステムプロパティとパラメーターを渡す際の問題にあります。どちらもargsプロパティの使用を含みます

また、あなたが渡すの違い読まなければならない-Dかを-P説明しているのGradleのマニュアルのを


これも見ました。まだ探しています。これらのメソッドはすべて、現在のプロパティを編集/マッサージして、それらを渡したいようです。アプリケーションまたはサービスを実行するためのコマンドラインとJavaプロパティは、「コンテキスト」または「構成」設定に似ています。「パラメーターの実行」などをサイドバイサイドのプロファイルなどとして実行するプラグインを用意することをお勧めします。
意志

5

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

gradle run path1 path2

これはできませんが、できる場合はどうすればよいでしょうか。

gralde run --- path1 path2

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

以下の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. グローバルinitスクリプトを追加する必要があります

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

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

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

gradleapp run --- f:/temp/x.xml

2
これはうまくいきます...私の引数がダッシュで始まっていない場合。これにより、一般的なコマンドラインパーサーでは役に立たなくなります:(。それが発生するとすぐに、gradleはそのargをgradleの引数として扱うようです(私はargsI.remove()望ましい効果を持っているとは思いません)。提案?
Krease

3

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

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

タスク定義に追加されました(dsl docsを参照)

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

gradle -Ph run
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.