Tugas Gradle - meneruskan argumen ke aplikasi Java

127

Saya memiliki aplikasi Java yang berjalan dengan tugas gradle kustom dan aplikasi tersebut memerlukan beberapa argumen saat dipanggil. Ini adalah:

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.

Tugas Gradle terlihat seperti:

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

Saya sudah mencoba berlari gradle run -hdan tidak berhasil.

RecuencoJones
sumber
Apakah jawabannya sesuai dengan kebutuhan Anda? Jika demikian, Anda harus menandai satu sebagai solusi.
Francisco J. Lopez-Pellicer
1
Tidak juga ... seorang teman dan saya menemukan cara untuk melakukannya tetapi kami belum menjelaskannya dengan jelas sehingga untuk menerbitkan solusi, kedua solusi yang diusulkan telah dicoba, kami mengerti apa yang harus dilakukan, tetapi tidak ' Sepertinya tidak berhasil ...
RecuencoJones
@ 6uitar6reat6od Bagaimana Anda menyelesaikannya pada akhirnya? Juga gradle versi berapa?
xlm

Jawaban:

80

Sejak Gradle 4.9, argumen baris perintah bisa diteruskan dengan --args. Misalnya, jika Anda ingin meluncurkan aplikasi dengan argumen baris perintah foo --bar, Anda dapat menggunakan

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

Lihat Juga Plugin Aplikasi Gradle

Cara mengupgrade Gradle wrapper

AMing
sumber
1
Apakah 'diharapkan atau salah ketik? Haruskah semua argumen diteruskan sebagai string yang dipisahkan oleh tanda kutip tunggal?
RecuencoJones
@RecuencoJones Diperbaiki per docs.gradle.org/current/userguide/…
Drew Stephens
1
gradle run --args = 'foo --bar'
Jim Flood
3
'foo --bar'membingungkan, mengapa tidak digunakan saja 'foo bar'.
Eric Wang
4
@EricWang Ini adalah argumen baris perintah arbitrer yang mungkin diperlukan program. Sangat menyenangkan untuk menunjukkan bahwa gradle mendukung segala jenis argumen, karena string mentah diteruskan ke aplikasi yang dibangun.
Joffrey
100

Gradle 4.9+

gradle run --args='arg1 arg2'

Ini mengasumsikan Anda build.gradledikonfigurasi dengan plugin Aplikasi . Anda build.gradleakan terlihat seperti ini:

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

Sertakan yang berikut ini dalam Anda build.gradle:

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

Kemudian untuk menjalankan: gradle run -PappArgs="['arg1', 'args2']"

xlm
sumber
7
Jawaban ini tidak hanya membantu, tetapi juga yang paling sederhana.
Jossie Calderon
Pembaruan untuk pembaruan Anda: gradle run --args 'arg1 arg2'Tidak berhasil untuk saya. Saya harus melakukan:gradle run --args='arg1 arg2'
cmyers
@cmyers terima kasih sudah menangkapnya! Saya telah memperbarui pembaruan saya
xlm
28

Maaf sudah terlambat menjawab.

Saya menemukan jawaban yang mirip dengan @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
}

Dan panggil seperti:

gradle run -Pmyargs=-d,s
RecuencoJones
sumber
28

Jika Anda ingin menggunakan kumpulan argumen yang sama sepanjang waktu, berikut ini yang Anda butuhkan.

run {
    args = ["--myarg1", "--myarg2"]
}
Claudio Fahey
sumber
2
Oke, untuk pemula absolut seperti saya: agar dapat menentukan tugas yang dijalankan build.gradle Anda harus berisi dua baris berikut: apply plugin: 'application' mainClassName = "<nama kelas lengkap termasuk jalur paket>" Jika tidak, Anda tidak dapat menentukan metode yang dijalankan di buuild.gradle
mk ..
1
Saya menggunakan id 'application'plugin dan ini adalah jawaban yang saya butuhkan (berfungsi).
Big Rich
6

Anda dapat menemukan solusinya dalam Masalah meneruskan properti dan parameter sistem saat menjalankan kelas Java melalui Gradle . Keduanya melibatkan penggunaan argsproperti

Anda juga harus membaca perbedaan antara passing with -Datau with -Pyang dijelaskan dalam dokumentasi Gradle

Francisco J. Lopez-Pellicer
sumber
Lihat ini juga. Masih mencari. Semua metode ini tampaknya ingin mengedit / memijat properti saat ini dan meneruskannya. Properti baris perintah dan Java untuk menjalankan aplikasi atau layanan mirip dengan pengaturan "Konteks" atau "Konfigurasi". Akan lebih baik untuk memiliki plugin yang melakukan hal-hal seperti "run parameter" sebagai profil berdampingan atau sesuatu.
akan
5

Tentu saja jawaban di atas semuanya melakukan pekerjaan itu, tetapi saya tetap ingin menggunakan sesuatu seperti

gradle run path1 path2

nah ini tidak bisa dilakukan, tapi bagaimana jika kita bisa:

gralde run --- path1 path2

Jika menurut Anda lebih elegan, maka Anda bisa melakukannya, triknya adalah memproses baris perintah dan memodifikasinya sebelum gradle melakukannya, ini dapat dilakukan dengan menggunakan skrip init

Skrip init di bawah ini:

  1. Proses baris perintah dan hapus --- dan semua argumen lain setelah '---'
  2. Tambahkan properti 'appArgs' ke gradle.ext

Jadi dalam tugas Anda (atau JavaExec, Exec) Anda dapat:

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

                args appArgs

 }

Skrip initnya adalah:

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

Batasan:

  1. Saya terpaksa menggunakan '---' dan bukan '-'
  2. Anda harus menambahkan beberapa skrip init global

Jika Anda tidak menyukai skrip init global, Anda dapat menentukannya di baris perintah

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

Atau lebih baik tambahkan alias ke shell Anda:

gradleapp run --- f:/temp/x.xml
Boaz Nahum
sumber
2
Ini bekerja dengan baik ... jika tidak ada argumen saya yang dimulai dengan tanda hubung. Ini membuatnya tidak berguna untuk parser baris perintah umum :(. Segera setelah itu terjadi, gradle tampaknya menganggap arg itu sebagai argumen untuk gradle (menurut saya tidak argsI.remove()ada efek yang diinginkan). Saran?
Krease
3

Anda perlu meneruskannya argske tugas menggunakan properti proyek, seperti:

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

ditambahkan ke definisi tugas Anda (lihat dokumen dsl )

Kemudian Anda dapat menjalankannya sebagai:

gradle -Ph run
cjstehno.dll
sumber