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


99

원격 호스트와 통신하는 간단한 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");

모든 것이 잘 작동합니다!

답변:


107

원래 답변 (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)

    }
}

명령 줄에서 제공된 인수


4
이 옵션을 빌드 파일에 "하드 코딩"하지 않고 싶습니다. 프록시 설정을 지정할 수 있으면 좋을 것입니다. 즉-명령 줄 인수 사용.
Evgeny

작동하지 않음 : "> 루트 프로젝트에서 'args'속성을 찾을 수 없습니다.
Evgeny

코드를 올바르게 복사 했습니까? 업데이트했습니다. args재산 이 없습니다 .
geoand

7
오늘 시도한 유일한 방법은 bootRun {jvmArgs = [ "-Dhttp.proxyHost = xxxxxx", "-Dhttp.proxyPort = xxxxxx"]}
Valentino Dell '

어떤 버전의 Gradle을 사용하고 있습니까?
geoand

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

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


2
이 JVM에 명령 행 옵션을 전달하기 위해 지금까지 가장 좋은 방법입니다
anubhava

@Marvin Frommhold, 귀하의 답변에 감사드립니다. 접근 방식은 매우 간단합니다. 저와 같은 멍청한 사람에게는 좀 더 자세하게 추가하면 도움이 될 것입니다. 제안 : (1) 인수와 함께 gradle 명령 줄 호출을 표시합니다. (2) Spring Boot에서 인수를 참조하는 방법을 보여줍니다. 예 : @Value ( "$ {property : default}"); (3) 매개 변수를 전달하는 IntelliJ 대화 상자의 스크린 샷도 도움이 될 것입니다.
Brett

1
경우에도 어떤 -D PARAMS을 통과하지 : "A 자식 컨테이너 시작할 때 실패 org.apache.catalina.LifecycleException는"슬프게도, 나를 위해, 그냥이 원인 bootRun과 함께 끔찍하게 실패 Gradle을 추가
tkruse

에 체리 따기 내가 대답으로 원하는 속성을이 해결 stackoverflow.com/questions/23689054
tkruse

7

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


1
예,이 솔루션이 작동합니다. 하지만이 코드를 소스 제어하에두고 싶지 않습니다. "가장 올바른"해결책은 명령 줄에서 직접이 옵션을 전달하는 것입니다. 그것을위한 방법이 있습니까?
Evgeny

1
게시물에 언급 된 링크는 명령 줄에서 전달하는 방법이 있습니다
suman j

5

@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

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

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


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

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


Application.class 또는 Bootstrap.class에서 이러한 인수를 사용하는 방법을 보여줄 수 있습니까? (저는 grails 3.xx를 사용하고 있습니다)
Stefano Scarpanti

2

작동하는 것 같습니다.

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

1

비슷한 문제가 발생했습니다. 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 에게 가야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.