Как передать параметры JVM из bootRun


я разрабатываю простое веб-приложение 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);

и единственным аргументом было напечатано: "единственный способ иметь установленный.кодировка=кодировка UTF-8".

если я установил системное свойство в коде:

    System.setProperty("http.proxyHost", "X.X.X.X");
    System.setProperty("http.proxyPort", "8080");

все работает просто отлично!

7 76

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 {
    systemProperties "property1": "value1", "property2": "value2"
}
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