如何从 bootRun 传递 JVM 选项

2022-08-31 09:28:38

我正在开发与远程主机通信的简单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");

一切都很好!


答案 1

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

Spring Boot gradle 插件的任务扩展了 gradle JavaExec 任务。请参阅此内容bootRun

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

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

添加到生成文件。

当然,您可以使用systemPropertiesjvmArgs

如果要从命令行有条件地添加 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)

    }
}

用于从命令行提供的参数


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

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


推荐