Подтвердить что ты не робот

Как передать системное свойство в задачу gradle

Я использую плагин gradle spring-boot, и мне нужно выбрать активный профиль spring для тестового прогона.

Как передать системное свойство spring.profiles.active в задачу плагина bootRun?

Что уже не удалось:

task bootRunLocal {
    systemProperty "spring.profiles.active", "local"
    System.setProperty("spring.profiles.active", "local")
    tasks.bootRun.execute() // I suspect that this task is executed in a separate JVM
}

и некоторая магия командной строки также не выполняется:

./gradle -Dspring.profiles.active=local bootRun

Может ли кто-нибудь помочь мне решить мои проблемы?

Обновление ответов и комментариев:

Я могу установить systemProperty и передать его в контейнер spring, выполнив:

run {
    systemProperty "spring.profiles.active", "local"
}

Однако, когда я это делаю, локальный профиль устанавливается для задачи bootRun и bootRunLocal. Мне нужно установить это свойство для задачи bootRunLocal и вызвать задачу booRun из bootRunLocal.

Это может показаться очень простым, но я прихожу с миром из структурированного мира Maven.

4b9b3361

Ответ 1

task local {
    run { systemProperty "spring.profiles.active", "local" }
}

bootRun.mustRunAfter local

Затем запустите команду gradle как:

gradle bootRun local

Ответ 2

Я знаю, что я опаздываю здесь... но я недавно столкнулся с этой точной проблемой. Я пытался запустить bootRun с параметрами spring.profiles.active и spring.config.location как системные свойства в командной строке.

Итак, чтобы заставить вашу командную строку "магия" работать, просто добавьте ее в свой build.gradle

bootRun {
    systemProperties System.properties
}

Затем выполняется из командной строки...

gradle -Dspring.profiles.active=local bootRun

Будет устанавливать локальный как активный профиль, без необходимости определять отдельную задачу просто для добавления переменной env.

Ответ 3

Нет общего способа передать свойства системы задаче. В двух словах он поддерживается только для задач, которые разворачивают отдельную JVM.

Задача bootRunLocal (как определено выше) не будет выполняться в отдельной JVM, а вызов execute() в задаче не поддерживается (и должен произойти на этапе выполнения в любом случае). С другой стороны, тесты выполняются в отдельной JVM (если выполняется задачей Test). Чтобы установить системные свойства для выполнения теста, вам необходимо настроить соответствующие задачи Test. Например:

test {
    systemProperty "spring.profiles.active", "local"
}

Для получения дополнительной информации см. Test в Gradle Справочник по языку сборки.

Ответ 4

Для gradle 2.14 ниже пример работает. Я добавил, как показано ниже.
Когда System.properties ['spring.profiles.active'] равно null, тогда задан профиль по умолчанию.

  bootRun {
       systemProperty 'spring.profiles.active', System.properties['spring.profiles.active']
    }

пример командной строки

gradle bootRun -Dspring.profiles.active=dev

Ответ 5

Просто для справки, если у кого-то будет эта проблема:

Ответ Влада не совсем сработал у меня, но он отлично работает с 2.4,

task local <<{
    bootRun { systemProperty "spring.profiles.active", "local" }
}
local.finalizedBy bootRun

тогда gradle local

Ответ 6

SPRING_PROFILES_ACTIVE=local gradle clean bootRun

Это соответствует this и this, и это работы.

Ответ 7

Вы можете создать новую задачу (в обсуждаемом случае с именем bootRunLocal), которая расширила бы org.springframework.boot.gradle.run.BootRunTask и установила свойства перед выполнением задачи. Вы можете создать такую ​​задачу с помощью следующего кода:

task bootRunLocal(type: org.springframework.boot.gradle.run.BootRunTask) {
    doFirst() {
        main = project.mainClassName
        classpath = sourceSets.main.runtimeClasspath
        systemProperty "spring.profiles.active", "local"
    }
}

Более подробную информацию можно найти здесь: https://karolkalinski.github.io/gradle-task-that-runs-spring-boot-aplication-with-profile-activated/

Ответ 8

Отвечая на точный запрос OP здесь...

Как передать spring.profiles.активное системное свойство в задачу плагина bootRun?

И если предположить, что "pass" OP означает "перейти от командной строки" или "перейти от вызова IDE"... Вот как мне это нравится.

Добавьте это в build.gradle:

/**
 * Task from spring-boot-gradle-plugin, configured for easier development
 */
bootRun {
    /* Lets you pick Spring Boot profile by system properties, e.g. gradle bootRun -Dspring.profiles.active=dev */
    systemProperties = System.properties
}

Затем, когда вы вызываете его, используйте знакомый флаг Java для установки системного свойства

gradle bootRun -Dspring.profiles.active=local

Существует одно главное преимущество использования свойств системы, опции переменных окружения (SPRING_PROFILES_ACTIVE=local gradle bootRun)... и эта простая переносимость между Linux/OS X (bash и т.д.) и Windows (cmd.exe в любом случае).

Я узнал этот путь из этого сообщения в блоге.

(ОБНОВЛЕНИЕ: Ах, как-то я пропустил ответ @Erich с той же рекомендацией. К сожалению, я оставляю свой ответ из-за дополнительных сведений о переносимости и т.д.)

Ответ 9

Это работает:

SPRING_PROFILES_ACTIVE = production./gradlew app-service: bootRun

Ответ 10

Начиная с SpringBoot 2.0.0-M5 setSystemProperties() больше не является методом задачи bootRun. Build.gradle необходимо обновить до

bootRun {
    execSpec {
        // System.properties["spring.profiles.active"]
       systemProperties System.properties
    }
}

В этом случае задача запуска SpringBoot использует org.gradle.process.JavaExecSpec

Это работает для меня, используя Gradle 4.2

Ответ 11

с командой запуска, которую вы можете добавить в файл сборки run { systemProperties = System.properties } и начать с gradle run -Dspring.profiles.active=local