2015-10-09 6 views
9

Wenn diese Frage gestellt und beantwortet wurde, oder dass es ein Dokument oder ein Beispiel gibt, bitte vergib mir. Ich habe mehrere Stunden damit verbracht, eine Lösung für stackoverflow und noch mehr Zeit im Gradle doc zu suchen und konnte das nicht schaffen.Verweise auf die Eigenschaften von Großbuchstaben in application.yml

Ich habe ein Springboot-Projekt mit einem hübschen Standard-Maven-Layout. Ich verwende Gradle 2.4. hier ist das Layout der Dateien relevent:

/gradle.properties 
/build.gradle 
/settings.gradle 
/src/main/resources/application.yml 

In gradle.properties, ich definiert haben folgende Eigenschaften:

name=Sample microservice 
description=brief description of the service goes here 
version=1.0.0-SNAPSHOT 

In meiner application.yml Datei, würde Ich mag jede Eigenschaft, die Feder auf diese gleichen Werte. (Ich möchte sie zusammen an einem Ort definieren und sie an mehreren Orten verwenden. Da version in der Regel in gradle.properties definiert ist, möchte ich den Rest auch dort Cluster.)

Ich habe Folgendes versucht Linie in application.yml, aber die Dinge funktionieren nicht wie erhofft: (. ich habe auch versucht ${project.name} usw., die entweder nicht funktioniert)

info.app.name: ${name} 
info.app.description: ${description} 
info.app.version: ${version} 

ich lief gradlew properties ... die Eigenschaften sind wie erwartet mit Werten aufgelistet. Wenn ich jedoch einen Build ausführe, wird die YAML-Datei wie erwartet in \build\resources\main kopiert, aber die ${value} Token werden nicht aufgelöst.

Ich habe auch die folgenden Zeilen in build.gradle Datei enthalten, aber die Dinge bleiben ungelöst.

processResources { 
    filesMatching('gradle.properties') { expand(project.properties) } 
} 

(Mein Ziel ist es, den Aktuator /info Endpunkt zu verwenden, um die Werte dieser Eigenschaften zu einem Dienst Anrufer zu liefern.)

Anregungen oder Hinweise auf die Dokumentation würde, dass Hilfe sehr geschätzt!

Antwort

2

Haben Sie über die Kopieraufgabe nachgedacht? Dort können Sie Variablen definieren erweitern:

application.yml:

info.app.name: ${project.name} 
info.app.description: ${project.description} 
info.app.version: ${project.version} 
info.app.foo: ${foo} 

build.gradle:

task copyConfig(type: Copy) { 
    from ('src/main/resources') 
    into 'build/config' 

    // refer to project and replace foo by string bar 
    expand(project: project, foo: 'bar') 

} 

Wenn Sie Ihre Eigenschaften halten Seperated Sie auch auf eine Properties-Datei verweisen :

expand(project.properties) 

Sie vielleicht einen Blick auf die gradle doc nehmen wollen: https://docs.gradle.org/current/userguide/working_with_files.html

Haben Sie die Idee?

+0

Dies funktioniert nicht für mich ... Ich erhalte eine Ausnahme: Verursacht von: groovy.lang.MissingPropertyException: Keine solche Eigenschaft: Projekt für Klasse: SimpleTemplateScript1 – drhender

+0

@trhender könnten Sie bitte den gesamten Call-Stack und/oder das Build-Skript – TobiSH

0

Nach mehr Basteln, entdeckte ich, dass die Werte zur Laufzeit erweitert werden. Wenn Spring die Eigenschaften in der Umgebung definiert, werden die $ {value} -Token so erweitert, wie ich es mir erhofft hatte. Nach reiflicher Überlegung macht das durchaus Sinn. Diese Werte können zur Build-Zeit nicht aufgelöst werden, da dies an verschiedenen Stellen eingestellt werden kann. Die Laufzeitfedereigenschaften geben den aktuellen Wert wieder, unabhängig davon, ob die Eigenschaft über die Anwendung festgelegt wurde.yml im jar, application.yml sitzt neben dem jar oder über einen -d-Schalter, wenn das jar ausgeführt wird.

+0

Nur um zu verdeutlichen, können die Eigenschaften * zur Erstellungszeit festgelegt werden * und * sie können zur Laufzeit überschrieben werden, wie Sie erwähnen. Es ist immer noch nützlich, Informationen zur Build-Zeit in die App einzubetten, damit sie erkannt und unterschieden werden kann *, auch wenn diese Informationen später überschrieben werden (versteckt) *. – m0j0hn

6

Ich sah vor kurzem die gleiche Situation - hier ist, was für mich arbeitete.

TL; DR: Im Frühling Boot 1.2.5, info * Eigenschaften in application.yml werden ignoriert von/info; Sie müssen application.properties für info. * Eigenschaften verwenden.

Zuerst src/main/resources/application.properties mit diesem Inhalt erstellen:

info.build.description=${description} 
info.build.name=${name} 
info.build.version=${version} 

Zweitens, fügen Sie diesen Schnipsel zu Ihrer build.gradle Datei:

processResources { 
    filesMatching("**/application.properties") { 
     expand(project.properties) 
    } 
} 

Als nächstes lief dein Build als normal. Dadurch wird die Datei application.properties verarbeitet und die Variablen durch ihre Build-Time-Werte ersetzt, während die Datei in build/resources/main/application.properties kopiert wird.

Wenn ich die implementierte .jar ausführe, wird mein/info-Endpunkt mit den erweiterten Werten gefüllt, was das Ziel ist.

Beachten Sie, dass für Bonuspunkte Sie diese zu Ihrem build.gradle hinzufügen können, um Git Info im/Infos Endpunkt zu erhalten, auch:

apply plugin: "com.gorylenko.gradle-git-properties" 

Sie müssen auch in diesem Abschnitt auf die Abhängigkeiten von Build hinzufügen .gradle, damit das funktioniert:

classpath 'gradle.plugin.com.gorylenko.gradle-git-properties:gradle-git-properties:1.+' 

Hoffe, das hilft!

+0

danke dafür. du hast mein Leben gerettet! – Lemuel

Verwandte Themen