wake-up-neo.com

Wie übergeben Sie die Systemeigenschaft an die Gradle-Task

Ich verwende das Gradle spring-boot-Plugin und muss für den Testlauf ein aktives Profil auswählen.

Wie übergebe ich die spring.profiles.active-Systemeigenschaft an die Aufgabe des bootRun-Plugins?

Was ist schon gescheitert:

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
}

und einige Befehlszeilenmagie schlägt auch fehl:

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

Könnte mir jemand helfen, meine Probleme zu lösen?

Update aus den Antworten und Kommentaren:

Ich kann die systemProperty einstellen und an den Federcontainer übergeben, indem Sie Folgendes tun:

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

Wenn ich dies jedoch mache, wird das lokale Profil für die bootRun-Task und die bootRunLocal-Task festgelegt. Ich brauche eine Möglichkeit, diese Eigenschaft für bootRunLocal task festzulegen und booRun task von bootRunLocal aufzurufen. 

Das hört sich vielleicht sehr einfach an, aber ich komme mit Frieden aus der strukturierten Welt von Maven.

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

bootRun.mustRunAfter local

Führen Sie dann den gradle-Befehl aus als:

gradle bootRun local
17
Vlad

Ich weiß, ich bin spät dran ... aber vor genau diesem Problem habe ich mich kürzlich getroffen. Ich habe versucht, bootRun mit spring.profiles.active und spring.config.location als Systemeigenschaften in der Befehlszeile zu starten. 

Damit Ihre Befehlszeile "magisch" funktioniert, fügen Sie dies einfach zu Ihrem build.gradle hinzu

bootRun {
    systemProperties System.properties
}

Dann von der Kommandozeile aus laufen ... 

gradle -Dspring.profiles.active=local bootRun

Wird lokal als aktives Profil festgelegt, ohne dass eine separate Aufgabe definiert werden muss, nur um die Variable env hinzuzufügen.

68
Erich

Es gibt keine generische Möglichkeit, Systemeigenschaften an eine Aufgabe zu übergeben. Kurz gesagt, es wird nur für Aufgaben unterstützt, die eine separate JVM bilden.

Die bootRunLocal-Task (wie oben definiert) wird nicht in einer separaten JVM ausgeführt, und der Aufruf von execute() für eine Task wird nicht unterstützt (und müsste in jedem Fall in der Ausführungsphase erfolgen). Tests dagegen werden immer in einer separaten JVM ausgeführt (wenn sie von einer Test-Task ausgeführt werden). Um die Systemeigenschaften für die Testausführung festzulegen, müssen Sie die entsprechenden Test-Task (s) konfigurieren. Zum Beispiel:

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

Weitere Informationen finden Sie unter Test in der Gradle-Referenz für die Build-Sprache .

17

Für Gradle 2.14 unten funktioniert das Beispiel. Ich habe wie folgt hinzugefügt.
Wenn System.properties ['spring.profiles.active'] null ist, wird das Standardprofil festgelegt.

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

befehlszeilenbeispiel

gradle bootRun -Dspring.profiles.active=dev
6
Mikołaj Mitura
SPRING_PROFILES_ACTIVE=local gradle clean bootRun

Dies ist gemäß dies und dies und es funktioniert.

6
Soumya

Nur als Referenz, wenn jemand dieses Problem hat:

Die Antwort von Vlad hat für mich nicht ganz funktioniert, aber diese funktioniert gut mit 2.4, 

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

dann gradle local

5

Auf die genaue Anfrage von OP hier antworten ...

Wie übergebe ich die Systemeigenschaft spring.profiles.active an die Aufgabe des bootRun-Plugins?

Und mit "pass" vorausgesetzt, das OP bedeutete "pass from commandline" oder "pass from IDE" - Aufruf "... So mache ich das gerne.

Fügen Sie dies zu build.gradle hinzu:

/**
 * 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
}

Wenn Sie es aufrufen, verwenden Sie dann das bekannte Java-Flag zum Festlegen einer Systemeigenschaft

gradle bootRun -Dspring.profiles.active=local

Es gibt einen Hauptvorteil der Beibehaltung der Systemeigenschaften gegenüber der Umgebungsvariablenoption (SPRING_PROFILES_ACTIVE=local gradle bootRun) ... und dies ist eine einfache Portierbarkeit zwischen Linux/OS X (Bash usw.) und Windows (cmd.exe).

Ich habe diesen Weg aus diesem Blogbeitrag gelernt.

(UPDATE: Ah, irgendwie hatte ich @ Erichs Antwort mit derselben Empfehlung verpasst. Hoppla! Ich lasse meine Antwort wegen der zusätzlichen Details zur Portabilität usw.)

3
hangtwenty

Sie können eine neue Aufgabe erstellen (im besprochenen Fall mit dem Namen bootRunLocal), die die Eigenschaften von org.springframework.boot.gradle.run.BootRunTask und die Setup-Eigenschaften vor der Ausführung der Aufgabe erweitert. Sie können eine solche Aufgabe mit folgendem Code erstellen:

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

Weitere Einzelheiten finden Sie hier: https://karolkalinski.github.io/gradle-task-that-runs-spring-boot-aplication-with-profile-activated/

3
user3683276

Entsprechend der spring-boot-gradle-plugin-Dokumentation sollten Sie solche Argumente übergeben können 

./gradlew bootRun --args='--spring.profiles.active=dev'

Es scheint, dass dies seit 4.9 ein neues Gradle-Feature ist. Ich habe es in meinem Projekt verwendet und es hat sich ohne Probleme bewährt.

2
Domo

Das funktioniert:

SPRING_PROFILES_ACTIVE = produktion ./gradlew app-service: bootRun

1
user2266870

Ab SpringBoot 2.0.0-M5 ist setSystemProperties() keine Methode der Task bootRun ..__ mehr. Das build.gradle muss aktualisiert werden

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

Dies ist, da springBoots Laufaufgabe org.gradle.process.JavaExecSpec verwendet.

Dies funktioniert für mich mit Gradle 4.2

1
CyclingSir

Eine andere Möglichkeit, die keine Unterstützung von der Gradle-Task erfordert: Setzen Sie die Umgebungsvariable Java_TOOL_OPTIONS :

Java_TOOL_OPTIONS='-Dfoo=bar' gradle ...

Oder wenn die Variable bereits nützliche Informationen enthält:

Java_TOOL_OPTIONS="$Java_TOOL_OPTIONS -Dfoo=bar" gradle ...
0
EndlosSchleife
// defualt value
def profiles = 'dev'

bootRun {
    args = ["--spring.profiles.active=" + profiles]
}

Dann können Sie einfach eine bestimmte Version auswählen, wenn Sie eine Gradle-Aufgabe starten, wie z

./gradlew bootRun -P dev

"dev" wird stattfinden "prod"

0
Simon

mit dem Befehl run können Sie die Build-Datei run { systemProperties = System.properties } hinzufügen und mit Gradle run -Dspring.profiles.active=local beginnen.

0
z0mb1ek