Как передать параметры 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