java 如何从bootRun传递JVM选项

von4xj4u  于 2023-01-01  发布在  Java
关注(0)|答案(9)|浏览(158)

我正在开发与远程主机通信的简单Spring Web应用程序,我希望在企业代理后对其进行本地测试。我使用“Sping Boot ”gradle插件,问题是如何为JVM指定代理设置?
我试过几种方法来做这件事:
1.第一个月

  1. export JAVA_OPTS="-Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080"
  2. export GRADLE_OPTS="-Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080"
    但是它们似乎都不起作用--“NoRouteToHostException”会抛出“network”代码。此外,我还添加了一些额外的代码来调试JVM启动参数:
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
    List<String> arguments = runtimeMxBean.getInputArguments();
    for (String arg: arguments) System.out.println(arg);

只打印了一个参数:“-D文件.编码=UTF-8”。
如果我在代码中设置系统属性:

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

一切都很好!

ssgvzors

ssgvzors1#

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

Sping Boot gradle插件的bootRun任务扩展了gradle JavaExec任务。请参见this
这意味着您可以通过添加以下内容来配置插件以使用代理:

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"

更新答案:

在使用 Sping 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)

    }
}

对于从命令行提供的参数

3gtaxfhh

3gtaxfhh2#

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

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

6yt4nkrj

6yt4nkrj3#

在gradle构建脚本中,为运行任务定义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中所述

slsn1g29

slsn1g294#

@marvin,谢谢你的帖子,很有帮助。
分享我如何使用它:

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

我想跳过一些JUnit测试,除非使用了一个属性来包含这些测试。使用JUnit Assume来有条件地包含测试:

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

使用gradle执行此操作需要在运行gradle构建时提供系统属性,如下所示,

gradle build -Ddeep.test.run=true

确实通过了测试。
希望这能帮助其他人尝试这种有条件地运行测试的方法。

gcuhipw9

gcuhipw95#

bootRun {
  args = ['myProgramArgument1', 'myProgramArgument2']
}

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

kyks70gy

kyks70gy6#

这似乎行得通:

bootRun {
    systemProperties "property1": "value1", "property2": "value2"
}
jfgube3f

jfgube3f7#

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

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将profile传递给spring。

dgtucam1

dgtucam18#

这里值得一提的是,一些使用Gradle和Sping Boot 的系统在build.gradle之外启动JVM,例如在Dockerfile中。
在一个关于bootRun的帖子中提及这一点并非毫无意义!我之所以在这里结束讨论,是因为这篇帖子吸引了大量关于在gradle下编译/运行的Sping Boot 应用程序上下文中的JVM选项的搜索。(我找到的所有关于添加java .NET.http.httpclient日志记录的建议都是“将其添加到bootRunjvmArgs“。
因此,如果您碰巧从Docker容器运行Gradle构建的Sping Boot 应用程序,您可能希望将JVM参数添加到项目的Docker文件中的env变量中,如下所示:

...
ENV JAVA_OPTS "${JAVA_OPTS} \
-server \
-Duser.timezone=UTC \
-XX:InitialRAMPercentage=50 \
-XX:MaxRAMPercentage=50 \
-Djavax.net.ssl.trustStorePassword=elvislives \
-Djavax.net.ssl.trustStoreProvider=BCFIPS \
-Djavax.net.ssl.trustStoreType=BCFKS \
-Djdk.internal.httpclient.debug=true \
-Djava.util.logging.manager=org.apache.logging.log4j2.jul.LogManager \
-Djdk.httpclient.HttpClient.log=errors,requests,headers,frames[:control:data:window:all..],content,ssl,trace,channel \
"
...

ENTRYPOINT java ${JAVA_OPTS} -cp app:app/lib/* com.mygreatcompany.theapp
bpsygsoo

bpsygsoo9#

对于作为Docker容器进行开发的情况,将其作为JAVA_OPTS添加到run_script. sh
JAVA_OPTS="-XX:+使用G1 GC-Xms 512 m-Xmx 2048 m--添加-打开java.base/java.util=全部-未命名-数据库.配置文件.活动=$配置文件,发现”

相关问题