如何从bootRun传递JVM选项
我正在开发与远程主机通信的简单的Spring Web应用程序,我想在公司代理的本地进行testing。 我使用“Spring Boot”gradle插件,问题是如何指定JVM的代理设置?
我尝试了几种方法来做到这一点:
gradle -Dhttp.proxyHost=XXXX -Dhttp.proxyPort=8080 bootRun
-
export JAVA_OPTS="-Dhttp.proxyHost=XXXX -Dhttp.proxyPort=8080"
-
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.RELEASE和Gradle 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
应该接受这个值。
@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