Pertanyaan Cara meneruskan opsi JVM dari bootRun


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

Saya sudah 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 start 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!


75
2017-08-01 11:27


asal


Jawaban:


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

Itu bootRun tugas dari Spring Boot plugin gradle memperluas 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 systemProperties dari pada jvmArgs

Jika Anda ingin menambahkan jvmArgs 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 seperti yang disebutkan oleh beberapa komentar. Namun, beberapa perubahan kecil dapat dilakukan untuk memulihkan kondisi kerja.

Kode baru adalah:

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

untuk argumen hard-coded, dan

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

    }
}

untuk argumen yang disediakan dari baris perintah


82
2017-08-01 11:39



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

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


52
2017-10-01 12:52



Dalam membangun skrip gradle, definisikan systemProperties untuk menjalankan tugas.

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

dan gradle run harus menerima nilai ini.

Atau tentukan properti tingkat proyek sebagaimana disebutkan dalam http://forums.gradle.org/gradle/topics/how_can_i_provide_command_line_args_to_application_started_with_gradle_run


4
2017-08-01 11:32



@marvin, terima kasih atas posting 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 sebuah properti digunakan untuk memasukkan tes semacam itu. Menggunakan JUnit Asume untuk menyertakan pengujian secara kondisional:

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

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

gradle build -Ddeep.test.run=true

memang dilewatkan ke tes.

Semoga ini membantu orang lain mencoba pendekatan ini untuk menjalankan tes secara kondisional.


3
2017-11-28 05:14



Tampaknya berfungsi:

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

1
2017-09-11 15:27



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

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


1
2017-08-05 15:28



Saya mendapat masalah yang sama, bootRun membutuhkan beberapa parameter tetapi saya tidak akan merasa seperti memodifikasi bootRun karena saya ingin menjaga fleksibilitas dan tetap pada perilaku bootRun standar. Saran saya adalah menambahkan beberapa tugas kustom (katakanlah bootRunDev, bootRunProxy) yang memperpanjang 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 pergi ke Karol Kaliński


0
2018-05-03 08:20