BootRun'dan JVM seçenekleri nasıl geçirilir


100

Uzak ana bilgisayarla iletişim kuran basit Spring web uygulaması geliştiriyorum ve kurumsal proxy arkasında yerel olarak test etmek istiyorum. "Spring Boot" gradle eklentisini kullanıyorum ve asıl soru, JVM için proxy ayarlarını nasıl belirleyebilirim?

Bunu yapmanın birkaç yolunu denedim:

  1. gradle -Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080 bootRun
  2. export JAVA_OPTS="-Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080"
  3. export GRADLE_OPTS="-Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080"

Ancak hiçbiri çalışmıyor gibi görünüyor - "NoRouteToHostException" "ağ" kodunu atıyor. Ayrıca, JVM başlangıç ​​argümanlarında hata ayıklamak için bazı ekstra kodlar ekledim:

    RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
    List<String> arguments = runtimeMxBean.getInputArguments();
    for (String arg: arguments) System.out.println(arg);

Ve yalnızca bir bağımsız değişken yazdırıldı: "-Dfile.encoding = UTF-8".

Kodda sistem özelliğini ayarlarsam:

    System.setProperty("http.proxyHost", "X.X.X.X");
    System.setProperty("http.proxyPort", "8080");

Herşey yolunda gidiyor!

Yanıtlar:


109

Orijinal Cevap (Gradle 1.12 ve Spring Boot 1.0.x kullanarak):

bootRunBahar Boot gradle Eklentinin görevi gradle JavaExec görevi uzanır. Bunu gör .

Bu, eklentiyi proxy kullanmak üzere yapılandırabileceğiniz anlamına gelir:

bootRun {
   jvmArgs = "-Dhttp.proxyHost=xxxxxx", "-Dhttp.proxyPort=xxxxxx"
}

derleme dosyanıza.

Tabii ki systemPropertiesyerine kullanabilirsinizjvmArgs

Komut satırından koşullu olarak jvmArgs eklemek istiyorsanız, aşağıdakileri yapabilirsiniz:

bootRun {
    if ( project.hasProperty('jvmArgs') ) {
        jvmArgs project.jvmArgs.split('\\s+')
    }
}

gradle bootRun -PjvmArgs="-Dwhatever1=value1 -Dwhatever2=value2"

Güncellenmiş Cevap:

Spring Boot 1.2.6.RELEASE ve Gradle 2.7'yi kullanarak yukarıdaki çözümümü denedikten sonra , bazı yorumlarda belirtildiği gibi çalışmadığını gözlemledim. Bununla birlikte, çalışma durumunu kurtarmak için birkaç küçük ayar yapılabilir.

Yeni kod:

bootRun {
   jvmArgs = ["-Dhttp.proxyHost=xxxxxx", "-Dhttp.proxyPort=xxxxxx"]
}

sabit kodlanmış argümanlar için ve

bootRun {
    if ( project.hasProperty('jvmArgs') ) {
        jvmArgs = (project.jvmArgs.split("\\s+") as List)

    }
}

komut satırından sağlanan argümanlar için


4
Bu seçeneğin derleme dosyasında "kodlanmış" olmasını istemiyorum. Proxy ayarlarını belirleme olanağına sahip olmak harika olurdu. Yani - komut satırı argümanlarını kullanarak.
Evgeny

Çalışmıyor: "> Kök projede 'değiştirgeler' özelliği bulunamadı".
Evgeny

Kodu doğru bir şekilde kopyaladınız mı? Bir güncelleme yaptım. argsMülk yok .
geoand

7
Bugün denedim ve bunun çalışmasının tek yolu dizelerin listesini, bootRun {jvmArgs = ["-Dhttp.proxyHost = xxxxxx", "-Dhttp.proxyPort = xxxxxx"]}
Valentino Dell '

Hangi gradle sürümünü kullanıyorsunuz?
geoand

73
bootRun {
  // support passing -Dsystem.property=value to bootRun task
  systemProperties = System.properties
}

Bu, tüm JVM seçeneklerini başlatılan uygulamaya aktarmalıdır bootRun.


2
Bu, komut satırı seçeneklerini
JVM'ye geçirmenin

@Marvin Frommhold, cevabınız için teşekkürler. Yaklaşım inanılmaz derecede basit. Benim gibi çaylaklar için biraz daha ayrıntı eklemeniz faydalı olacaktır. Öneriler: (1) değişkenlerle gradle komut satırı çağrısını gösterir; (2) Spring Boot'ta argümanlara nasıl başvurulacağını gösterin, örneğin @Value ("$ {property: default}"); (3) Parametreleri geçen IntelliJ iletişim kutusunun ekran görüntüsü de yardımcı olacaktır.
Brett

1
Bile herhangi -D params geçmediğine: "Bir çocuk konteyner başından sırasında başarısız oldu org.apache.catalina.LifecycleException" Ne yazık ki, benim için, sadece bu nedenler bootRun ile korkunç başarısız gradle ekleyerek
tkruse

İçin kiraz-çekme bir cevap olarak istediğiniz özelliklere göre çözüldü stackoverflow.com/questions/23689054
tkruse

7

Gradle build komut dosyasında, çalıştırma görevi için systemProperties'i tanımlayın.

//to provide the properties while running the application using spring-boot's run task
    run {
        systemProperties['property name'] = 'value'
    }

ve gradle runbu değeri kabul etmelidir.

Veya http://forums.gradle.org/gradle/topics/how_can_i_provide_command_line_args_to_application_started_with_gradle_run'da belirtildiği gibi proje düzeyinde bir özellik tanımlayın


1
Evet, bu çözüm işe yarıyor. Ancak bu kodun kaynak kontrolü altında olmasını istemiyorum. "En doğru" çözümün bu seçenekleri doğrudan komut satırından geçirmek olduğuna inanıyorum. Bunun için herhangi bir yolu var mı?
Evgeny

1
Gönderide bahsedilen bağlantı, onları komut satırından geçirmenin bir yolunu sunuyor
suman j

5

@marvin, gönderiniz için teşekkürler, çok yardımcı oldu.

Nasıl kullandığımı paylaşıyorum:

test {
  // support passing -Dsystem.property=value to bootRun task
  systemProperties = System.properties
}

Bu tür testleri dahil etmek için bir özellik kullanılmadıkça atlamak istediğim JUnit testleri var. JUnit Assume kullanarak testleri koşullu olarak dahil etmek için:

//first line of test
assumeThat(Boolean.parseBoolean(System.getProperty("deep.test.run","false"),true)

Bunu gradle ile yapmak, burada gösterilen gradle derlemesini çalıştırırken sağlanan sistem özelliğinin,

gradle build -Ddeep.test.run=true

gerçekten de testlerden geçti.

Umarım bu, başkalarının testleri koşullu olarak yürütmek için bu yaklaşımı denemelerine yardımcı olur.


3
bootRun {
  args = ['myProgramArgument1', 'myProgramArgument2']
}

JvmArgs kullanmak JVM başlatma sorunlarına neden olabilir. Bağımsız değişkenler kullanmak, özel program argümanlarınızı iletmenizi sağlar


Bu argümanları Application.class veya Bootstrap.class içinde nasıl kullanacağımı bana gösterebilir misin? (
Grails

2

İşe yarıyor gibi görünüyor:

bootRun {
    systemProperties "property1": "value1", "property2": "value2"
}

1

Benzer bir sorunla karşılaştım, bootRun'un bazı parametrelere ihtiyacı vardı, ancak biraz esneklik sağlamak ve standart bootRun davranışına bağlı kalmak istediğim için bootRun'u değiştirmek istemem. Önerim, aşağıdaki kod parçacığında açıklandığı gibi, bootRun'u genişleten bazı özel görevler (bootRunDev, bootRunProxy diyelim) eklemektir.

task bootRunPxy(type: org.springframework.boot.gradle.run.BootRunTask, dependsOn: 'build') {
    group = 'Application'
    doFirst() {
        main = project.mainClassName
        classpath = sourceSets.main.runtimeClasspath
        systemProperty 'http.proxyHost', 'xxxxx'
        systemProperty 'http.proxyPort', 'yyyyy'
    }
}

Komut dosyasını kullanmak için bir ortamım yok, ancak bu yaklaşımı spring.profiles.active özelliğini kullanarak profili yaya geçirmek için kullandım. Krediler Karol Kaliński'ye gitmeli

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.