如何从bootRun传递JVM选项

我正在开发与远程主机通信的简单的Spring Web应用程序,我想在公司代理的本地进行testing。 我使用“Spring Boot”gradle插件,问题是如何指定JVM的代理设置?

我尝试了几种方法来做到这一点:

  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"

但似乎没有一个工作 – “NoRouteToHostException”引发“networking”代码。 另外,我添加了一些额外的代码来debuggingJVM启动参数:

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

而且只打印了一个参数:“-Dfile.encoding = UTF-8”。

如果我在代码中设置系统属性:

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

一切正常!

原始答案(使用Gradle 1.12和Spring Boot 1.0.x):

Spring Boot gradle插件的bootRun任务扩展了gradle JavaExec任务。 看到这个

这意味着您可以通过添加以下configuration插件来使用代理:

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

到您的构build文件。

当然你可以使用jvmArgs而不是jvmArgs

如果你想有条件地从命令行添加jvmArgs,你可以执行以下操作:

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

已更新答案:

在使用Spring Boot 1.2.6.RELEASEGradle 2.7试用了我的解决scheme之后,我发现它不像一些评论中提到的那样工作。 但是,可以做一些小的调整来恢复工作状态。

新的代码是:

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

为硬编码参数,和

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

从命令行提供的参数

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

这应该将所有JVM选项传递给通过bootRun启动的应用程序。

在gradle构build脚本中,为运行任务定义systemProperties。

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

gradle run应该接受这个值。

或者按http://forums.gradle.org/gradle/topics/how_can_i_provide_command_line_args_to_application_started_with_gradle_run中所述定义项目级属性;

@marvin,感谢您的post,这是非常有益的。

分享我如何使用它:

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

我有JUnittesting,我想跳过,除非一个属性被用来包括这样的testing。 使用JUnit假设有条件地包含testing:

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

用gradle做这个要求在运行gradle build时提供的系统属性,

 gradle build -Ddeep.test.run=true 

确实通过了testing。

希望这有助于其他人尝试这种方法有条件地运行testing。

它似乎工作:

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

使用jvmArgs可能会导致JVM启动问题。 使用参数允许您传递自定义程序参数

我遇到了类似的问题,bootRun需要一些参数,但我不想修改bootRun,因为我想保持一定的灵活性,并坚持标准的bootRun行为。 我的build议是添加一些扩展bootRun的自定义任务(比如说bootRunDev,bootRunProxy),如下面的代码段所述

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

我没有一个运行脚本的环境,但是我使用这个方法来使用属性spring.profiles.active将configuration文件传递给spring。 学分应该去KarolKaliński