[java] bootRun에서 JVM 옵션을 전달하는 방법

원격 호스트와 통신하는 간단한 Spring 웹 애플리케이션을 개발 중이며 회사 프록시 뒤에서 로컬로 테스트하고 싶습니다. “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");

모든 것이 잘 작동합니다!



답변

원래 답변 (Gradle 1.12 및 Spring Boot 1.0.x 사용) :

bootRun봄 부팅 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)

    }
}

명령 줄에서 제공된 인수


답변

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

를 통해 시작된 앱에 모든 JVM 옵션을 전달해야합니다 bootRun.


답변

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에 언급 된대로 프로젝트 수준 속성을 정의합니다.


답변

@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

실제로 테스트를 통과했습니다.

이것이 조건부로 테스트를 실행하기 위해이 접근법을 시도하는 다른 사람들에게 도움이되기를 바랍니다.


답변

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

jvmArgs를 사용하면 JVM 시작 문제가 발생할 수 있습니다. args를 사용하면 사용자 정의 프로그램 인수를 전달할 수 있습니다.


답변

작동하는 것 같습니다.

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


답변

비슷한 문제가 발생했습니다. bootRun에는 몇 가지 매개 변수가 필요했지만 유연성을 유지하고 표준 bootRun 동작을 고수하고 싶기 때문에 bootRun을 수정하고 싶지 않습니다. 내 제안은 다음 코드 스 니펫에 설명 된대로 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 속성을 사용하여 프로필을 spring에 전달했습니다. 크레딧은 Karol Kaliński 에게 가야합니다.