Como passar opções da JVM a partir do bootRun

Estou desenvolvendo um aplicativo da Web simples do Spring que se comunica com o host remoto e gostaria de testá-lo localmente atrás do proxy corporativo. Eu uso o plug-in gradle “Spring Boot” e a questão é como posso especificar configurações de proxy para a JVM?

Eu tentei várias maneiras de fazer isso:

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

Mas parece que nenhum deles funciona – “NoRouteToHostException” coloca o código “network”. Além disso, adicionei algum código extra para depurar os argumentos de início da JVM:

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

E apenas um argumento foi impresso: “-Dfile.encoding = UTF-8”.

Se eu definir a propriedade do sistema no código:

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

Tudo funciona muito bem!

Resposta Original (usando Gradle 1.12 e Spring Boot 1.0.x):

A tarefa bootRun do plug-in gradle do Spring Boot estende a tarefa JavaExec do gradle. Veja isso .

Isso significa que você pode configurar o plug-in para usar o proxy, adicionando:

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

para o seu arquivo de compilation.

Claro que você poderia usar o systemProperties vez de jvmArgs

Se você quiser adicionar jvmArgs condicionalmente a partir da linha de comando, poderá fazer o seguinte:

 bootRun { if ( project.hasProperty('jvmArgs') ) { jvmArgs project.jvmArgs.split('\\s+') } } gradle bootRun -PjvmArgs="-Dwhatever1=value1 -Dwhatever2=value2" 

Resposta Atualizada:

Depois de testar minha solução acima usando o Spring Boot 1.2.6.RELEASE e o Gradle 2.7 , observei que ele não estava funcionando como alguns dos comentários mencionam. No entanto, alguns pequenos ajustes podem ser feitos para recuperar o estado de trabalho.

O novo código é:

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

para argumentos codificados, e

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

para argumentos fornecidos a partir da linha de comando

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

Isso deve passar todas as opções da JVM para o aplicativo iniciado via bootRun .

Em gradle build script, defina systemProperties para executar a tarefa.

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

e gradle run deve aceitar esse valor.

Ou defina uma propriedade no nível do projeto, conforme mencionado em http://forums.gradle.org/gradle/topics/how_can_i_provide_command_line_args_to_application_started_with_gradle_run

@marvin, obrigado pelo seu post, foi muito útil.

Compartilhando como eu usei:

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

Eu tenho testes de JUnit que eu queria ignorar a menos que uma propriedade foi usada para include esses testes. Usando o JUnit Assume para include os testes condicionalmente:

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

Fazer isso com o gradle exigia que a propriedade do sistema fornecida no momento da execução da gradle build, mostrada aqui,

 gradle build -Ddeep.test.run=true 

foi de fato passado para os testes.

Espero que isso ajude os outros a experimentar esta abordagem para a execução de testes condicionalmente.

Parece funcionar:

 bootRun { systemProperties "property1": "value1", "property2": "value2" } 
 bootRun { args = ['myProgramArgument1', 'myProgramArgument2'] } 

O uso do jvmArgs pode causar problemas de boot da JVM. O uso de args permite que você passe seus argumentos do programa customizado

Eu entrei em um problema similar, o bootRun precisava de alguns parâmetros, mas eu não me sentiria como modificar o bootRun, já que eu quero manter alguma flexibilidade e manter o comportamento padrão do bootRun. Minha sugestão é adicionar algumas tarefas personalizadas (digamos bootRunDev, bootRunProxy) que estendam o bootRun, conforme descrito no seguinte trecho 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' } } 

Eu não tenho um ambiente para exercitar o script, mas usei essa abordagem para passar o perfil para a primavera usando a propriedade spring.profiles.active. Créditos devem ir para Karol Kaliński