Как передать параметры JVM из bootRun
я разрабатываю простое веб-приложение 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);
и единственным аргументом было напечатано: "единственный способ иметь установленный.кодировка=кодировка UTF-8".
если я установил системное свойство в коде:
System.setProperty("http.proxyHost", "X.X.X.X");
System.setProperty("http.proxyPort", "8080");
все работает просто отлично!
7 ответов:
оригинальный ответ (с помощью Gradle 1.12 и Spring Boot 1.0.x):
The
bootRun
задача плагина Spring Boot gradle расширяет задачу gradle JavaExec. Смотрите этой.это означает, что вы можете настроить плагин для использования прокси, добавив:
bootRun { jvmArgs = "-Dhttp.proxyHost=xxxxxx", "-Dhttp.proxyPort=xxxxxx" }
в свой файл build.
конечно, вы могли бы использовать
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.Отпустите и ш 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
@Марвин, спасибо за ваш пост, он был очень полезным.
обмен, как я использовал его:
test { // support passing -Dsystem.property=value to bootRun task systemProperties = System.properties }
у меня есть тесты JUnit, которые я хотел пропустить, если свойство не было использовано для включения таких тестов. Использование JUnit предполагает включение тестов условно:
//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 может привести к проблемам запуска виртуальной машины. Использование args позволяет передавать пользовательские аргументы программы
Я попал в аналогичную проблему, 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 с помощью свойства весна.профили.активный. Кредиты должны идти в Karol Kaliński