원격 호스트와 통신하는 간단한 Spring 웹 애플리케이션을 개발 중이며 회사 프록시 뒤에서 로컬로 테스트하고 싶습니다. “Spring Boot”gradle 플러그인 을 사용하는데 JVM에 대한 프록시 설정을 어떻게 지정할 수 있습니까?
몇 가지 방법을 시도했습니다.
gradle -Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080 bootRun
export JAVA_OPTS="-Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080"
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.RELEASE 및 Gradle 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 에게 가야합니다.