一尘不染

如何从bootRun传递JVM选项

spring-boot

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

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

  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"

但是似乎它们都不起作用-“ NoRouteToHostException”抛出“网络”代码。另外,我添加了一些额外的代码来调试JVM启动参数:

    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", "X.X.X.X");
    System.setProperty("http.proxyPort", "8080");

一切正常!


阅读 319

收藏
2020-05-30

共1个答案

一尘不染

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

bootRunspring启动gradle这个插件的任务延长了gradle这个JavaExec任务。看到这个

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

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

到您的构建文件。

当然,您可以使用systemProperties代替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
尝试上述解决方案后,我发现它无法正常工作,因为其中提到了一些注释。但是,可以进行一些小的调整以恢复工作状态。

新的代码是:

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

对于硬编码的参数,以及

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

    }
}

用于从命令行提供的参数

2020-05-30