J'essaie de configurer gradle pour lancer le processus bootRun
avec différents profils de ressort activés.
Ma configuration actuelle de bootRun
ressemble à ceci:
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']
}
}
J'aimerais définir les propriétés du système avec une tâche gradle
, puis exécuter bootRun
.
Ma tentative ressemblait à ceci:
task bootRunDev
bootRunDev {
System.setProperty("spring.profiles.active", "Dev")
}
Quelques questions:
systemProperty
fait-il partie de la configuration de démarrage au démarrage de printemps?bootRunDev
se produise avant bootRun
-Eric
Le moyen le plus simple serait de définir les paramètres par défaut et de permettre leur remplacement. Je ne sais pas quelle est l'utilisation de systemProperty dans ce cas. Des arguments simples feront le travail.
def profiles = 'prod'
bootRun {
args = ["--spring.profiles.active=" + profiles]
}
Pour lancer dev:
./gradlew bootRun -Pdev
Pour ajouter des dépendances à votre tâche, vous pouvez faire quelque chose comme ceci:
task setDevProperties(dependsOn: bootRun) << {
doFirst {
System.setProperty('spring.profiles.active', profiles)
}
}
Il y a beaucoup de façons d'atteindre cet objectif dans Gradle.
Modifier:
Configurez des fichiers de configuration distincts pour chaque environnement.
if (project.hasProperty('prod')) {
apply from: 'gradle/profile_prod.gradle'
} else {
apply from: 'gradle/profile_dev.gradle'
}
Chaque configuration peut remplacer des tâches, par exemple:
def profiles = 'prod'
bootRun {
systemProperty "spring.profiles.active", activeProfile
}
Courez en fournissant prod
flag dans ce cas comme ceci:
./gradlew <task> -Pprod
Les variables d’environnement peuvent être utilisées pour définir les propriétés des ressorts, comme décrit dans la documentation . Donc, pour définir les profils actifs (spring.profiles.active
), vous pouvez utiliser le code suivant sur les systèmes Unix:
SPRING_PROFILES_ACTIVE=test gradle clean bootRun
Et sous Windows, vous pouvez utiliser:
SET SPRING_PROFILES_ACTIVE=test
gradle clean bootRun
Pour les personnes utilisant Spring Boot 2.0+, vous pouvez utiliser les éléments suivants pour configurer une tâche qui exécutera l'application avec un ensemble donné de profils.
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'
}
}
Ensuite, vous pouvez simplement exécuter ./gradlew bootRunDev
ou similaire de votre IDE.
En utilisant cette commande Shell cela fonctionnera:
SPRING_PROFILES_ACTIVE=test gradle clean bootRun
Malheureusement, c'est la façon la plus simple que j'ai trouvée. Il définit la propriété d'environnement pour cet appel, puis exécute l'application.
Pour quelqu'un de l'Internet, il y avait une question similaire https://stackoverflow.com/a/35848666/906265 Je fournis la réponse modifiée ici aussi:
// 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"]
}
}
}
}
<...>
puis en terminal:
gradle runDev
A utilisé gradle 3.4.1
et spring boot 1.5.10.RELEASE
Configuration pour 4 tâches différentes avec différents profils et dépendances de tâches de gradation:
bootRunLocal
et bootRunDev
- exécuté avec un profil spécifiquebootPostgresRunLocal
et bootPostgresRunDev
identiques à prev, mais en exécutant la tâche personnalisée runPostgresDocker
et killPostgresDocker
avant/après bootRunbuild.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)
}
}
Ajouter à VM options: -Dspring.profiles.active = dev
Je voulais que ce soit simple, simplement pour pouvoir appeler gradle bootRunDev comme vous sans avoir à saisir du texte en plus.
Cela a fonctionné pour moi - en configurant d’abord le bootRun dans ma tâche, puis juste après l’exécution de bootRun, ce qui a bien fonctionné pour moi :)
task bootRunDev {
bootRun.configure {
systemProperty "spring.profiles.active", 'Dev'
}
}
bootRunDev.finalizedBy bootRun