Expansion automatique des propriétés avec démarrage à ressort

1. Vue d’ensemble

Dans cet article, nous allons explorer le mécanisme d’expansion des propriétés fourni par Spring grâce aux méthodes de construction Maven et Gradle.

2. Maven

2.1. Configuration par défaut

Pour les projets Maven utilisant spring-boot-starter-parent , des configurations supplémentaires ne sont pas nécessaires pour utiliser les extensions de propriété:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.RELEASE</version>
</parent>

Nous pouvons maintenant développer les propriétés de notre projet en utilisant les espaces réservés @ …​ @ .

Voici un exemple de la façon dont nous pouvons enregistrer la version du projet extraite de Maven dans nos propriétés:

----[email protected]@[email protected]@
----

Nous ne pouvons utiliser ces extensions que dans des fichiers de configuration correspondant à ces modèles:

  • /application ** .yml

  • /application ** .yaml

  • /application ** .properties

2.2. Configuration manuelle

En l’absence du parent spring-boot-starter-parent , nous devrons configurer ce filtrage et cette expansion manuellement. Nous devons inclure l’élément resources dans la section < _ build> de notre fichier pom.xml_ :

<resources>
    <resource>
        <directory>${basedir}/src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>** ** /application** .yml</include>
            <include>** ** /application** .yaml</include>
            <include>** ** /application** .properties</include>
         </includes>
    </resource>
</resources>

Et dans les < _ plugins> _ :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.7</version>
    <configuration>
        <delimiters>
            <delimiter>@</delimiter>
        </delimiters>
        <useDefaultDelimiters>false</useDefaultDelimiters>
    </configuration>
</plugin>

Dans les cas où il est nécessaire d’utiliser les espaces réservés standard de type $ \ {variable.name} , nous devrons définir useDefaultDelimeters sur true et votre application.properties ressemblera à ceci:

expanded.project.version=${project.version}
expanded.project.property=${custom.property}

3. Gradle

3.1. Solution graduée standard

La gradle solution de la documentation Spring Boot n’est pas 100% compatible avec la propriété Maven filtrage et expansion.

Pour nous permettre d’utiliser le mécanisme d’expansion de la propriété, nous devons inclure le code suivant dans build.gradle :

processResources {
    expand(project.properties)
}

Cette solution limitée présente les différences suivantes par rapport à la configuration par défaut de Maven:

  1. Ne prend pas en charge les propriétés avec des points (par exemple, user.name) . Gradle

comprend les points comme délimiteurs de propriété d’objet .

  1. Utilise les espaces réservés par défaut du signe dollar $ \ {…​} ainsi en conflit

avec les espaces réservés standard Spring

3.2. Solution compatible Maven

Pour que nous puissions répliquer la solution standard Maven et utiliser les espaces réservés de style @ …​ @ , nous devons ajouter le code suivant à notre build.gradle :

import org.apache.tools.ant.filters.ReplaceTokens
processResources {
    with copySpec {
        from 'src/main/resources'
        include '** ** /application** .yml'
        include '** ** /application** .yaml'
        include '** ** /application** .properties'
        project.properties.findAll().each {
          prop ->
            if (prop.value != null) {
                filter(ReplaceTokens, tokens:[(prop.key): prop.value])
                filter(ReplaceTokens, tokens:[('project.' + prop.key): prop.value])
            }
        }
    }
}

Cela résoudra toutes les propriétés du projet. Nous ne pouvons toujours pas définir de propriétés avec des points (par exemple, user.name) dans the build.gradle , mais nous pouvons maintenant utiliser le fichier gradle.properties pour définir des propriétés au format de propriétés Java standard, et il prend également en charge les propriétés avec des points (par exemple, database.url ) .

Cette version ne filtre que les fichiers de configuration du projet et non pas toutes les ressources. Elle est compatible à 100% avec la solution Maven.

4. Conclusion

Dans ce rapide didacticiel, nous avons vu comment étendre automatiquement les propriétés de Spring Spring à l’aide des méthodes de construction Maven et Gradle, et comment migrer facilement de l’une à l’autre.

L’exemple complet de la source est disponible à l’adresse over sur GitHub .