Pregunta Cómo pasar opciones de JVM desde bootRun


Estoy desarrollando aplicaciones web Spring simples que se comunican con el host remoto y me gustaría probarlas localmente detrás del proxy corporativo. Utilizo el complemento gradle "Spring Boot" y la pregunta es ¿Cómo puedo especificar la configuración del proxy para JVM?

He intentado varias formas de hacerlo:

  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"

Pero parece que ninguno de ellos funciona - "NoRouteToHostException" arroja el código de "red". Además, he agregado un código adicional para depurar argumentos de inicio de JVM:

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

Y solo se imprimió un argumento: "-Dfile.encoding = UTF-8".

Si configuro la propiedad del sistema en código:

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

¡Todo funciona bien!


75
2017-08-01 11:27


origen


Respuestas:


Respuesta original (usando Gradle 1.12 y Spring Boot 1.0.x):

los bootRun La tarea del plugin Spring Boot gradle extiende la tarea gradle JavaExec. Ver esta.

Eso significa que puede configurar el complemento para usar el proxy agregando:

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

a su archivo de compilación.

Por supuesto, podrías usar el systemProperties en lugar de jvmArgs

Si desea agregar jvmArgs condicionalmente desde la línea de comando, puede hacer lo siguiente:

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

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

Respuesta actualizada:

Después de probar mi solución anterior usando Spring Boot 1.2.6.RELEASE y Gradle 2.7 Observé que no estaba funcionando, como mencionan algunos de los comentarios. Sin embargo, se pueden hacer algunos ajustes menores para recuperar el estado de trabajo.

El nuevo código es:

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

para argumentos codificados, y

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

    }
}

para los argumentos proporcionados desde la línea de comando


82
2017-08-01 11:39



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

Esto debería pasar todas las opciones de JVM a la aplicación iniciada a través de bootRun.


52
2017-10-01 12:52



En el script de compilación gradle, defina las propiedades del sistema para ejecutar la tarea.

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

y gradle run debería aceptar este valor

O define una propiedad de nivel de proyecto como se menciona en 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, gracias por tu publicación fue muy útil.

Compartiendo cómo lo usé:

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

Tengo pruebas JUnit que quería omitir a menos que se utilizara una propiedad para incluir dichas pruebas. Usando JUnit Assume para incluir las pruebas condicionalmente:

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

Hacer esto con gradle requiere que la propiedad del sistema proporcionada en el momento de ejecutar la compilación gradle, que se muestra aquí,

gradle build -Ddeep.test.run=true

de hecho pasó a las pruebas.

Espero que esto ayude a otros a probar este enfoque para ejecutar pruebas condicionalmente.


3
2017-11-28 05:14



Parece funcionar:

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

1
2017-09-11 15:27



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

El uso de jvmArgs puede causar problemas de inicio de JVM. Usar args le permite pasar los argumentos de su programa personalizado


1
2017-08-05 15:28



Me metí en un problema similar, bootRun necesitaba algunos parámetros, pero no tenía ganas de modificar bootRun ya que quería mantener cierta flexibilidad y mantener el comportamiento estándar de arranque. Mi sugerencia es agregar algunas tareas personalizadas (digamos bootRunDev, bootRunProxy) que extienden bootRun, como se describe en el siguiente fragmento de código

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

No tengo un entorno para ejercitar el script, pero utilicé este enfoque para pasar el perfil a la primavera con la propiedad spring.profiles.active. Los créditos deberían ir a Karol Kaliński


0
2018-05-03 08:20