web-dev-qa-db-ja.com

gradleタスクを介してスプリングプロファイルでbootRunを実行する方法

さまざまなスプリングプロファイルを有効にしてbootRunプロセスを起動するようにgradleを設定しようとしています。

現在の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")
}

いくつかの質問:

  1. systemPropertyは、スプリングブートbootRun構成の一部ですか?
  2. 別のタスクでシステムプロパティを設定することは可能ですか?
  3. 次のステップは何でしょうか? bootRunDevの前にbootRunの設定を行う必要があります
  4. 私が検討すべき別のアプローチはありますか

-エリック

31
Eric Francis

最も簡単な方法は、デフォルトを定義して上書きできるようにすることです。この場合の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)
  }
}

Gradleでこれを達成する方法はたくさんあります。

編集:

環境ごとに個別の構成ファイルを構成します。

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
32
Vaelyr

ドキュメント で説明されているように、環境変数を使用してスプリングプロパティを設定できます。したがって、アクティブなプロファイル(spring.profiles.active)を設定するには、Unixシステムで次のコードを使用できます。

SPRING_PROFILES_ACTIVE=test gradle clean bootRun

また、Windowsでは次を使用できます。

SET SPRING_PROFILES_ACTIVE=test
gradle clean bootRun
35
david

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'
    }
}

次に、IDEから./gradlew bootRunDevまたは同様のものを実行するだけです。

8
Yona Appletree

このシェルコマンドを使用すると動作します。

SPRING_PROFILES_ACTIVE=test gradle clean bootRun

悲しいことに、これは私が見つけた最も簡単な方法です。その呼び出しの環境プロパティを設定し、アプリを実行します。

4
Rafael

インターネットからの誰かのために、同様の質問がありました https://stackoverflow.com/a/35848666/906265 私もそれから修正された答えをここに提供します:

// 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.1spring boot 1.5.10.RELEASEを使用している

2

異なるプロファイルとgradleタスクの依存関係を持つ4つの異なるタスクの構成:

  • bootRunLocalおよびbootRunDev-特定のプロファイルで実行
  • bootPostgresRunLocalおよびbootPostgresRunDevはprevと同じですが、カスタムタスクrunPostgresDockerおよびkillPostgresDockerをbootRunの前後に実行します

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)
    }
}
2
radistao

VMオプションに追加:-Dspring.profiles.active = dev

1
meiskalt7

私は、あなたのようなgradle bootRunDevを、余分な入力をすることなく呼び出すことができるようにするだけで簡単にしたかったのです。

これは私のために働いた-最初に私のタスクでbootRunを設定し、次にbootRunを実行した直後に私にとってうまくいった:)

task bootRunDev {
    bootRun.configure {
        systemProperty "spring.profiles.active", 'Dev'
    }
}

bootRunDev.finalizedBy bootRun
0
Mohamed Omar