Как запустить bootRun с профилем spring с помощью задачи gradle
Я пытаюсь настроить gradle для запуска процесса bootRun
с включенными профилями spring.
Моя текущая конфигурация bootRun
выглядит следующим образом:
bootRun {
// pass command line options from gradle to bootRun
// usage: gradlew bootRun "-Dspring.profiles.active=local,protractor"
if (System.properties.containsKey('spring.profiles.active')) {
systemProperty "spring.profiles.active", System.properties['spring.profiles.active']
}
}
Я хотел бы установить системные свойства с помощью задачи gradle
, а затем выполнить bootRun
.
Моя попытка выглядела так:
task bootRunDev
bootRunDev {
System.setProperty("spring.profiles.active", "Dev")
}
Несколько вопросов:
- является
systemProperty
частью конфигурации загрузки bootRun spring?
- Можно ли установить системное свойство в другой задаче?
- Каким должен быть мой следующий шаг? Мне нужно получить конфигурацию
bootRunDev
до bootRun
- Есть ли другой подход, который я должен рассмотреть в
-Эрик
Ответы
Ответ 1
Самый простой способ - определить значение по умолчанию и разрешить его переопределить. Я не уверен, что такое использование systemProperty в этом случае. Простые аргументы будут выполнять эту работу.
def profiles = 'prod'
bootRun {
args = ["--spring.profiles.active=" + profiles]
}
Чтобы запустить dev:
./gradlew bootRun -Pdev
Чтобы добавить зависимости от вашей задачи, вы можете сделать что-то вроде этого:
task setDevProperties(dependsOn: bootRun) << {
doFirst {
System.setProperty('spring.profiles.active', profiles)
}
}
В Грэдле есть много способов добиться этого.
Редактировать:
Настройте отдельные файлы конфигурации для каждой среды.
if (project.hasProperty('prod')) {
apply from: 'gradle/profile_prod.gradle'
} else {
apply from: 'gradle/profile_dev.gradle'
}
Каждая конфигурация может переопределять задачи, например:
def profiles = 'prod'
bootRun {
systemProperty "spring.profiles.active", activeProfile
}
Запустите, предоставив флаг prod
в этом случае так:
./gradlew <task> -Pprod
Ответ 2
Переменные среды могут использоваться для установки свойств пружины, как описано в документации. Итак, для установки активных профилей (spring.profiles.active
) вы можете использовать следующий код в системах Unix:
SPRING_PROFILES_ACTIVE=test gradle clean bootRun
И на Windows вы можете использовать:
SET SPRING_PROFILES_ACTIVE=test
gradle clean bootRun
Ответ 3
Для тех, кто использует Spring Boot 2. 0+, вы можете использовать следующее для установки задачи, которая будет запускать приложение с заданным набором профилей.
task bootRunDev(type: org.springframework.boot.gradle.tasks.run.BootRun, dependsOn: 'build') {
group = 'Application'
doFirst() {
main = bootJar.mainClassName
classpath = sourceSets.main.runtimeClasspath
systemProperty 'spring.profiles.active', 'dev'
}
}
Затем вы можете просто запустить ./gradlew bootRunDev
или аналогичный из вашей IDE.
Ответ 4
Используя эту команду оболочки, она будет работать:
SPRING_PROFILES_ACTIVE=test gradle clean bootRun
К сожалению, это самый простой способ, который я нашел. Он устанавливает свойство среды для этого вызова и затем запускает приложение.
Ответ 5
Для кого-то из Интернета возник аналогичный вопрос fooobar.com/questions/1004933/... Здесь я также предоставлю измененный ответ:
// build.gradle
<...>
bootRun {}
// make sure bootRun is executed when this task runs
task runDev(dependsOn:bootRun) {
// TaskExecutionGraph is populated only after
// all the projects in the build have been evaulated https://docs.gradle.org/current/javadoc/org/gradle/api/execution/TaskExecutionGraph.html#whenReady-groovy.lang.Closure-
gradle.taskGraph.whenReady { graph ->
logger.lifecycle('>>> Setting spring.profiles.active to dev')
if (graph.hasTask(runDev)) {
// configure task before it is executed
bootRun {
args = ["--spring.profiles.active=dev"]
}
}
}
}
<...>
то в терминале:
gradle runDev
Использовали gradle 3.4.1
и spring boot 1.5.10.RELEASE
Ответ 6
Конфигурация для 4-х разных задач с разными профилями и зависимостями графических задач:
-
bootRunLocal
и bootRunDev
- запуск с определенным профилем -
bootPostgresRunLocal
и bootPostgresRunDev
же, как и предыдущие, но выполнение пользовательской задачи runPostgresDocker
и killPostgresDocker
до/после загрузки
build.gradle
:
final LOCAL='local'
final DEV='dev'
void configBootTask(Task bootTask, String profile) {
bootTask.main = bootJar.mainClassName
bootTask.classpath = sourceSets.main.runtimeClasspath
bootTask.args = [ "--spring.profiles.active=$profile" ]
// systemProperty 'spring.profiles.active', profile // this approach also may be used
bootTask.environment = postgresLocalEnvironment
}
bootRun {
description "Run Spring boot application with \"$LOCAL\" profile"
doFirst() {
configBootTask(it, LOCAL)
}
}
task bootRunLocal(type: BootRun, dependsOn: 'classes') {
description "Alias to \":${bootRun.name}\" task: ${bootRun.description}"
doFirst() {
configBootTask(it, LOCAL)
}
}
task bootRunDev(type: BootRun, dependsOn: 'classes') {
description "Run Spring boot application with \"$DEV\" profile"
doFirst() {
configBootTask(it, DEV)
}
}
task bootPostgresRunLocal(type: BootRun) {
description "Run Spring boot application with \"$LOCAL\" profile and re-creating DB Postgres container"
dependsOn runPostgresDocker
finalizedBy killPostgresDocker
doFirst() {
configBootTask(it, LOCAL)
}
}
task bootPostgresRunDev(type: BootRun) {
description "Run Spring boot application with \"$DEV\" profile and re-creating DB Postgres container"
dependsOn runPostgresDocker
finalizedBy killPostgresDocker
doFirst() {
configBootTask(it, DEV)
}
}
Ответ 7
Добавить в опции VM: -Dspring.profiles.active = dev
Ответ 8
Я хотел, чтобы это было просто, чтобы иметь возможность вызывать gradle bootRunDev, как вы, без необходимости какой-либо дополнительной печати.
Это сработало для меня - сначала настроив bootRun в моей задаче, а затем сразу после запуска bootRun, который работал нормально для меня :)
task bootRunDev {
bootRun.configure {
systemProperty "spring.profiles.active", 'Dev'
}
}
bootRunDev.finalizedBy bootRun