Как запустить 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