Как передать параметры 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 start:
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");
Все работает отлично!
Ответы
Ответ 1
Оригинальный ответ (используя Gradle 1.12 и Spring Boot 1.0.x):
Задача bootRun
плагина Spring Boot Gradle расширяет задачу JavaExec Gradle. См. .
Это означает, что вы можете настроить плагин на использование прокси, добавив:
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)
}
}
для аргументов из командной строки
Ответ 2
bootRun {
// support passing -Dsystem.property=value to bootRun task
systemProperties = System.properties
}
Это должно передать все параметры JVM для приложения, запущенного через bootRun
.
Ответ 3
В gradle build script определите systemProperties для выполнения задачи.
//to provide the properties while running the application using spring-boot 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
Ответ 4
@marvin, спасибо за сообщение, это было очень полезно.
Поделиться тем, как я его использовал:
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 build, показано здесь,
gradle build -Ddeep.test.run=true
действительно прошел тесты.
Надеемся, что это поможет другим испытать этот подход для условного тестирования.
Ответ 5
Кажется, что работает:
bootRun {
systemProperties "property1": "value1", "property2": "value2"
}
Ответ 6
bootRun {
args = ['myProgramArgument1', 'myProgramArgument2']
}
Использование jvmArg может вызвать проблемы с запуском JVM. Использование args позволяет передавать пользовательские аргументы программы
Ответ 7
У меня возникла аналогичная проблема, 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'
}
}
У меня нет среды для использования script, но я использовал этот подход для передачи профиля в spring с использованием свойства spring.profiles.active.
Кредиты должны перейти на Karol Kaliński