Gradle aracılığıyla Java sınıfını çalıştırırken sistem özelliklerini ve parametrelerini aktarırken karşılaşılan sorunlar


82

Hızlı entegrasyon testinin bir parçası olarak Gradle aracılığıyla bir komut satırı Java uygulaması çalıştırmaya çalışıyorum. Derleme komut dosyalarımı Maven'den taşıyorum, bu işlemin kolayca yapılabildiğiexec-maven-plugin . Benim iki büyük ihtiyacım:

  • Sistem özelliklerini çalıştırılabilir Java koduna geçirebilme
  • Komut satırı bağımsız değişkenlerini çalıştırılabilir Java koduna geçirebilme

Lütfen bu özellikleri derleme betiğinde okumaya çalışmadığımı, betiğin oluşturup çalıştırdığı Java programında okumaya çalıştığımı unutmayın.

Ben diğer iki SO Mesajları bulduk adresinin Java programı Gradle aracılığıyla yürütme: savunucuları kullanarak bu bir cevap bir apply plugin: "application"yapı dosyasında ve gradle runkomut satırına ve cevapları bu yaklaşımı savunan yanı sıra kullanan başka task execute(type:JavaExec)yapı dosyasında ve gradle executede komut satırı . Her iki yaklaşımı da denedim ve başarılı olamadım.

İki sorunum var:

(1) Sistem özelliklerini okumak için çalıştırılabilir Java dosyasını alamıyorum

Bunu yapsam da:

build.gradle :

apply plugin: 'application'
mainClassName = "com.mycompany.MyMain"

Komut satırı :

gradle run -Dmyproperty=myvalue

Veya bu:

build.gradle :

task execute (type:JavaExec) {
    main = "com.mycompany.MyMain"
    classpath = sourceSets.main.runtimeClasspath 
}

Komut satırı :

gradle execute -Dmyproperty=myvalue

Her iki durumda da, mypropertybaşaramaz. MyMain.main (...)Çalıştırmaya başlayan kod , mypropertysistem özelliğini boş / eksik olarak okur .

(2) Komut satırı argümanlarını iletemiyorum

Bu muhtemelen ilk problemle ilgilidir. İçindeexec-maven-plugin , örneğin, bir komut satırı bağımsız değişken kendileri bir sistem özelliği aracılığıyla geçirilen edildi. Gradle'da durum bu mu, yoksa komut satırı argümanlarını iletmenin başka bir yolu var mı?

Bu değişkenleri nasıl geçiririm? Ayrıca, kullanmak daha mı iyi apply plugin: 'application'yoksa task execute (type:JavaExec)?

Yanıtlar:


124

Anladım. Ana sorun, Gradle yeni bir Java sürecini çatalladığında, ortam değişkeni değerlerini yeni ortama otomatik olarak iletmemesidir. Bu değişkenlerin açık bir şekildesystemProperties , görevin veya eklentinin özelliği .

Diğer sorun, komut satırı değiştirgelerinin nasıl geçirileceğini anlamaktı; bunlar args, görev veya eklenti üzerindeki özellik aracılığıyla yapılır . Maven'de olduğu gibi exec-maven-plugin, komut satırında , nesneleri kabul eden split()ayarlamadan önce olması gereken boşlukla sınırlanmış bir liste olarak, başka bir sistem özelliği aracılığıyla komut satırına aktarılmalıdır . Mülke eski Maven adı olan adını verdim .argsListexec.args

Hem görünüyor javaExec uygulama eklentisi yaklaşımı geçerli. Diğer özelliklerinden bazılarını kullanmak isterse (otomatik olarak bir dağıtımı bir araya getirmek, vb.) Uygulama eklentisi yaklaşımını tercih edebilirsiniz.

Çözümler şunlardır:

JavaExec Yaklaşımı

Komut Satırı :

gradle execute -Dmyvariable=myvalue -Dexec.args="arg1 arg2 arg3"

build.gradle :

task execute (type:JavaExec) {

    main = "com.myCompany.MyMain"
    classpath = sourceSets.main.runtimeClasspath 

    /* Can pass all the properties: */
    systemProperties System.getProperties()

    /* Or just each by name: */
    systemProperty "myvariable", System.getProperty("myvariable")

    /* Need to split the space-delimited value in the exec.args */
    args System.getProperty("exec.args", "").split()    
}

Uygulama Eklentisi Yaklaşımı

Komut Satırı :

gradle run -Dmyvariable=myvalue -Dexec.args="arg1 arg2 arg3"

build.gradle :

apply plugin: 'application'
mainClassName = "com.mycompany.MyMain"
run {    
    /* Can pass all the properties: */
    systemProperties System.getProperties()

    /* Or just each by name: */
    systemProperty "myvariable", System.getProperty("myvariable")

    /* Need to split the space-delimited value in the exec.args */
    args System.getProperty("exec.args", "").split()    
}

3
Bunun System.getProperties () (büyük S) olması gerektiğini düşünüyorum.
orlanthi

1
Gradle 2.xx kullanıyorsanız, aşağıdakileri de kullanabilirsiniz: -systemProperty "myvariable", "${myvariable}"
eadjei

1
Teşekkür ederim! Salatalık testlerini çalıştırmaya çalışıyordum ve ortam değişkenlerini JVM'ye geçirmek istedim. "SystemProperties System.getProperties ()" öğesini {} çalıştırma yerine test {} 'e koydum
Svante

1
Varsayılan bölmenin boşluklu argümanlara izin vermediğini lütfen unutmayın, örneğin -Dexec.args="--greeting 'hello there'"- çalışmaz, başka bir sınırlayıcı ayarlamanız gerekir.
Ivan Balashov

3
Kullanın: args System.getProperty ("exec.args", "") .split () herhangi bir bağımsız değişken sağlanmadıysa boş işaretçi istisnasını önlemek için. Örneğin, 'kademeli görevler' bile önerilen build.gradle ile bir istisna oluşturacaktır
Mike Hanafey

12

İlgisiz Gradle prop'larını geçerek uygulamanızın sistem özelliklerini kirletmek istemeyenler için, argümanlarınızı ad aralıklarını belirlemenizi tavsiye ederim.

tasks.withType(JavaExec) {
    System.properties.each { k,v->
        if (k.startsWith("prefix.")) {
            systemProperty k - "prefix.", v
        }
    }
}

java ... -Dprefix.my.prop=true geçecek my.prop


3

Sınıflandırmada yeniyim, bu yüzden buna ihtiyacım vardı ve 4.6 ile benim için çalışan şey komut satırı için biraz daha kolay görünüyor. 1 arg dizesini ayrıştırmak yerine, bir dizi bağımsız değişken geçirebilirsiniz ve ben de tüm özelliği tek satırla geçirmenin bir yolunu buldum. Aşağıda birleştirilmiştir:

apply plugin: 'java'
apply plugin: 'org.springframework.boot'    <- for my project

task runApp(type: JavaExec) {
  classpath = sourceSets.main.runtimeClasspath

  main = 'testit.TomcatApp'

  // arguments to pass to the application
  //  args 'myarg1 -rest'    <- came in as 1 string

  args = ["--myarg1 with spaces even", "--myarg2"]

  // and to pass in all -D system property args:
  systemProperties = System.properties
}

gradle run -Dwhatever=xxx -Dmyarg2=hey

// Java reading them:
public static void main(String[] args) {
    for ( int i = 0; i < args.length; i++ )
        {
        logger.info( "** args [" + i + "] =" + args[i] + "=" );
        }
    logger.info( "** -Dwhatever =" + System.getProperty("whatever") + "=" );
    logger.info( "** -Dmyarg2 =" + System.getProperty("myarg2") + "=" );

[main] INFO testit.TomcatApp - ** args [0] =--myarg1 with spaces even=
[main] INFO testit.TomcatApp - ** args [1] =--myarg2=
[main] INFO testit.TomcatApp - ** -Dwhatever =xxx=
[main] INFO testit.TomcatApp - ** -Dmyarg2 =hey=

-2

Belki partiye geç kaldım, ama herhangi biri "gradle'ı yürütmeden önce pervaneyi kurmayı" denedi mi? Test ettim ve görünüşe göre bu da çalışıyor.

myVar=myVal gradle test

Örneğin, aktif profili şu şekilde ayarlayabilirsiniz:

SPRING_PROFILES_ACTIVE=dev  gradle test

Görünüşe göre bunlar da işe yarıyor: (test edildi)

set myVar=myVal && gradle test      # for windows
export myVar=myVal && gradle test   # for linux and mac

myVarDöneme göre ayrılamayan dikkatli olun yoksa sadece ilk periyottan önceki kısım anahtar olarak alınacaktır.

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.