Cara melewatkan opsi JVM dari bootRun

99

Saya sedang mengembangkan aplikasi web Spring sederhana yang berkomunikasi dengan host jarak jauh dan saya ingin mengujinya secara lokal di belakang proxy perusahaan. Saya menggunakan plugin gradle "Spring Boot" dan pertanyaannya adalah bagaimana saya dapat menentukan pengaturan proxy untuk JVM?

Saya telah mencoba beberapa cara untuk melakukannya:

  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"

Tapi sepertinya tidak ada yang berfungsi - "NoRouteToHostException" melempar kode "jaringan". Juga, saya telah menambahkan beberapa kode tambahan untuk men-debug argumen awal JVM:

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

Dan hanya satu argumen yang dicetak: "-Dfile.encoding = UTF-8".

Jika saya mengatur properti sistem dalam kode:

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

Semuanya bekerja dengan baik!

Evgeny
sumber

Jawaban:

107

Jawaban Asli (menggunakan Gradle 1.12 dan Spring Boot 1.0.x):

The bootRuntugas Spring Boot Plugin Gradle meluas tugas JavaExec Gradle. Lihat ini .

Itu berarti Anda dapat mengonfigurasi plugin untuk menggunakan proxy dengan menambahkan:

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

ke file build Anda.

Tentu saja Anda bisa menggunakan systemPropertiesbukannyajvmArgs

Jika Anda ingin menambahkan jvmArgs secara bersyarat dari baris perintah, Anda dapat melakukan hal berikut:

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

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

Jawaban yang Diperbarui:

Setelah mencoba solusi saya di atas menggunakan Spring Boot 1.2.6. RELEASE dan Gradle 2.7 saya mengamati bahwa itu tidak berfungsi karena beberapa komentar menyebutkan. Namun, beberapa perubahan kecil dapat dilakukan untuk memulihkan status kerja.

Kode barunya adalah:

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

untuk argumen hard-code, dan

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

    }
}

untuk argumen yang diberikan dari baris perintah

geoand
sumber
4
Saya tidak ingin opsi ini "di-hardcode" dalam file build. Akan sangat bagus untuk memiliki kemungkinan untuk menentukan pengaturan proxy. Yaitu - menggunakan argumen baris perintah.
Evgeny
Tidak berfungsi: "> Tidak dapat menemukan properti 'args' pada proyek root".
Evgeny
Apakah Anda menyalin kode dengan benar? Saya telah melakukan pembaruan. Tidak ada argsproperti.
geoand
7
Saya mencoba hari ini dan satu-satunya cara untuk bekerja, adalah dengan melampaui daftar string dengan tanda kurung siku, seperti bootRun {jvmArgs = ["-Dhttp.proxyHost = xxxxxx", "-Dhttp.proxyPort = xxxxxx"]}
Valentino Dell ' Aica
Versi gradle apa yang Anda gunakan?
geoand
72
bootRun {
  // support passing -Dsystem.property=value to bootRun task
  systemProperties = System.properties
}

Ini harus meneruskan semua opsi JVM ke aplikasi yang dimulai melalui bootRun.

Marvin Frommhold
sumber
2
Sejauh ini, ini adalah cara terbaik untuk meneruskan opsi baris perintah ke JVM
anubhava
@Marvin Frommhold, terima kasih atas jawaban Anda. Pendekatannya sangat mudah. Untuk pemula seperti saya, akan sangat membantu jika Anda menambahkan sedikit lebih banyak detail. Saran: (1) tampilkan panggilan baris perintah gradle dengan argumen; (2) tunjukkan cara mereferensikan argumen di Spring Boot, misalnya, @Value ("$ {property: default}"); (3) Tangkapan layar dari dialog IntelliJ yang meneruskan params juga akan membantu.
Brett
1
Sayangnya, bagi saya, hanya menambahkan ini menyebabkan bootRun gradle gagal parah dengan "org.apache.catalina.LifecycleException: Penampung anak gagal saat mulai" bahkan ketika tidak meneruskan parameter -D
tkruse
Dipecahkan dengan memilih ceri properti yang saya inginkan seperti dalam jawaban stackoverflow.com/questions/23689054
tkruse
7

Dalam skrip build gradle, tentukan systemProperties untuk tugas yang dijalankan.

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

dan gradle runharus menerima nilai ini.

Atau tentukan properti tingkat proyek seperti yang disebutkan di http://forums.gradle.org/gradle/topics/how_can_i_provide_command_line_args_to_application_started_with_gradle_run

suman j
sumber
1
Ya, solusi ini berhasil. Tetapi saya tidak ingin kode ini berada di bawah kendali sumber. Saya percaya bahwa solusi "paling tepat" adalah meneruskan opsi ini langsung di baris perintah. Apakah ada cara untuk itu?
Evgeny
1
Tautan yang disebutkan di pos memiliki cara untuk meneruskannya dari baris perintah
suman j
5

@marvin, terima kasih atas kiriman Anda, itu sangat membantu.

Berbagi bagaimana saya menggunakannya:

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

Saya memiliki tes JUnit yang ingin saya lewati kecuali ada properti yang digunakan untuk memasukkan tes tersebut. Menggunakan JUnit Assume untuk menyertakan pengujian secara kondisional:

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

Melakukan ini dengan gradle mengharuskan properti sistem yang disediakan pada saat menjalankan build gradle, yang ditampilkan di sini,

gradle build -Ddeep.test.run=true

memang lolos ke ujian.

Semoga ini bisa membantu orang lain mencoba pendekatan ini untuk menjalankan pengujian secara bersyarat.

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

Menggunakan jvmArgs dapat menyebabkan masalah mulai JVM. Menggunakan args memungkinkan Anda meneruskan argumen program kustom Anda

Cristian Botiza
sumber
Dapatkah Anda menunjukkan kepada saya cara menggunakan argumen ini di Application.class atau di Bootstrap.class? (Saya menggunakan grails 3.xx)
Stefano Scarpanti
2

Sepertinya berhasil:

bootRun {
    systemProperties "property1": "value1", "property2": "value2"
}
levsa
sumber
1

Saya mengalami masalah yang sama, bootRun membutuhkan beberapa parameter tetapi saya tidak ingin memodifikasi bootRun karena saya ingin menjaga fleksibilitas dan tetap berpegang pada perilaku bootRun standar. Saran saya adalah menambahkan beberapa tugas khusus (katakanlah bootRunDev, bootRunProxy) yang memperluas bootRun, seperti yang dijelaskan dalam cuplikan kode berikut

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'
    }
}

Saya tidak memiliki lingkungan untuk menjalankan skrip tetapi saya menggunakan pendekatan ini untuk meneruskan profil ke musim semi menggunakan properti spring.profiles.active. Kredit harus diberikan ke Karol Kaliński

Evelino Bomitali
sumber