Gradle görevi - argümanları Java uygulamasına ilet


127

Özel bir gradle görevi ile çalışan bir Java uygulamam var ve uygulama çağrıldıktan sonra bazı argümanlar gerektiriyor. Bunlar:

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 görevi şöyle görünür:

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

Koşmayı denedim gradle run -hve çalışmıyor.


Cevaplar ihtiyaçlarınıza uygun mu? Öyleyse, birini çözüm olarak işaretlemelisiniz.
Francisco J. Lopez-Pellicer

1
Pek değil ... bir arkadaşım ve ben bunu yapmanın bir yolunu keşfettik ama henüz bir çözüm yayınlayacak kadar net değiliz, her iki çözüm de denendi, ne yapılması gerektiğini anladık ama yapamadık '' gerçekten işe yarıyor gibi görünüyor ...
RecuencoJones

@ 6uitar6reat6od Sonunda bunu nasıl çözdünüz? Ayrıca gradle'ın hangi versiyonu?
xlm

Yanıtlar:


80

Gradle 4.9'dan bu yana, komut satırı argümanları --args ile iletilebilir. Örneğin, uygulamayı komut satırı bağımsız değişkenleriyle başlatmak foo --baristiyorsanız, şunu kullanabilirsiniz:

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

Ayrıca Bkz. Gradle Uygulama Eklentisi

Gradle sarıcı nasıl yükseltilir


1
'Bekleniyor mu yoksa bir yazım hatası mı? Tüm argümanlar tek tırnakla ayrılmış bir dizge olarak mı aktarılmalı?
RecuencoJones

@RecuencoJones docs.gradle.org/current/userguide/… uyarınca düzeltildi
Drew Stephens

1
gradle run --args = 'foo --bar'
Jim Flood

3
'foo --bar'kafa karıştırıcı, neden sadece kullanmayalım 'foo bar'.
Eric Wang

4
@EricWang Bunlar bir programın ihtiyaç duyabileceği keyfi komut satırı argümanlarıdır. Ham dizge yerleşik uygulamaya geçirildiğinden, gradle'ın her türlü argümanı desteklediğini göstermek güzel.
Joffrey

100

Gradle 4.9+

gradle run --args='arg1 arg2'

Bu build.gradle, sizin Uygulama eklentisi ile yapılandırıldığını varsayar . Sizin build.gradlebuna benzer görünmelidir:

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

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

Ön Gradle 4.9

Aşağıdakileri ekleyin build.gradle:

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

Sonra koşmak için: gradle run -PappArgs="['arg1', 'args2']"


7
Bu cevap sadece yardımcı olmadı, en basit olanıydı.
Jossie Calderon

Güncellemeniz için güncelleme: gradle run --args 'arg1 arg2'Benim için çalışmadı. Yapmam gerekiyordu:gradle run --args='arg1 arg2'
cmyers

@cmyers bunu yakaladığınız için teşekkürler! Güncellememi güncelledim
xlm

28

Bu kadar geç cevap verdiğim için özür dilerim.

@Xlm 'e benzer bir cevap buldum:

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

Ve şöyle çağırın:

gradle run -Pmyargs=-d,s

28

Her zaman aynı argüman kümesini kullanmak istiyorsanız, ihtiyacınız olan tek şey şudur.

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

2
Tamam, benim gibi mutlak yeni başlayanlar için: çalıştırma görevini tanımlayabilmek için build.gradle'ınız şu iki satırı içermelidir: uygulama eklentisi: 'application' mainClassName = "<paket yolu dahil tam sınıf adı>" Aksi takdirde, tanımlayamazsınız buuild.gradle'de çalıştırma yöntemi
mk ..

1
id 'application'Eklentiyi kullanıyorum ve ihtiyacım olan cevap buydu (işe yarıyor).
Big Rich

6

Çözümü Gradle aracılığıyla Java sınıfını çalıştırırken sistem özelliklerini ve parametrelerini geçerken karşılaşılan sorunlar bölümünde bulabilirsiniz . Her ikisi de argsmülkün kullanımını içerir

Ayrıca , Gradle belgelerinde açıklanan ile -Dveya bununla geçiş arasındaki farkı okumalısınız.-P


Bunu da gördüm. Hala arıyor. Bu yöntemlerin tümü, mevcut özellikleri düzenlemek / masaj yapmak ve bunları iletmek istiyor gibi görünüyor. Bir uygulamayı veya hizmeti çalıştırmak için komut satırı ve Java özellikleri, "Bağlam" veya "Yapılandırma" ayarına benzer. Yan yana profiller gibi "parametreleri çalıştır" gibi şeyler yapan bir eklentiye sahip olmak daha iyi olacaktır.
will

5

Elbette her şeyden önce cevaplar işe yarar, ancak yine de şöyle bir şey kullanmak istiyorum

gradle run path1 path2

peki bu yapılamaz, ama ya yapabilirsek:

gralde run --- path1 path2

Daha zarif olduğunu düşünüyorsanız, bunu yapabilirsiniz, işin püf noktası komut satırını işlemek ve gradle yapmadan önce değiştirmektir, bu init betikleri kullanılarak yapılabilir.

Aşağıdaki başlangıç ​​komut dosyası:

  1. Komut satırını işleyin ve --- ve '---' ardından gelen diğer tüm argümanları kaldırın
  2. Gradle.ext 'appArgs' özelliğini ekleyin

Böylece, çalıştırma görevinizde (veya JavaExec, Exec) şunları yapabilirsiniz:

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

                args appArgs

 }

Başlangıç ​​betiği:

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

Sınırlamalar:

  1. '-' kullanmak zorunda kaldım, '-' değil
  2. Bazı global init komut dosyası eklemelisiniz

Global init komut dosyasını sevmiyorsanız, komut satırında belirtebilirsiniz.

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

Veya kabuğunuza bir takma ad ekleyin:

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

2
Bu harika çalışıyor ... eğer argümanlarımdan hiçbiri kısa çizgi ile başlamazsa. Bu, onu genel komut satırı çözümleyicileri için işe yaramaz hale getirir :(. Bu olur olmaz, gradle bu argümanı derecelendirmek için bir argüman olarak görüyor gibi görünüyor (bunun argsI.remove()istenen etkiye sahip olduğunu düşünmüyorum ). Öneriler?
Krease

4

Bunları argsproje özelliklerini kullanarak görev olarak iletmeniz gerekir , örneğin:

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

görev tanımınıza eklendi ( dsl belgelerine bakın )

O zaman şu şekilde çalıştırabilirsiniz:

gradle -Ph run
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.