Expansão automática de propriedades com inicialização por mola

Expansão automática de propriedades com inicialização por mola

*1. Visão geral *

Neste artigo, exploraremos o mecanismo de expansão de propriedade fornecido pelo Spring através dos métodos de construção Maven e Gradle.

===* 2. Maven *

====* 2.1 Configuração padrão *

Para projetos Maven usando o spring-boot-starter-parent, não há necessidade de configurações extras para fazer uso de expansões de propriedades:

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

Agora podemos expandir as propriedades do nosso projeto usando espaços reservados _ @… @ _. Aqui está um exemplo de como podemos salvar a versão do projeto tirada do Maven em nossas propriedades:

[email protected]@
[email protected]@

Só podemos usar essas expansões em arquivos de configuração que correspondem a esses padrões:

*_*  */aplicativo* .yml_
*_*  */aplicativo* .yaml_
*_*  */application* .properties_

2.2 Configuração manual

Na ausência do spring-boot-starter-parent parent, precisaremos configurar essa filtragem e expansão manualmente. Precisamos incluir o elemento resources na seção <build> do nosso arquivo 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>

E nos <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>

Nos casos em que é necessário usar os espaços reservados padrão do tipo _ $ \ {variable.name} , precisamos definir _useDefaultDelimeter como true, e seu application.properties terá a seguinte aparência:

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

*3. Gradle *

====* 3.1 Solução Padrão Gradle *

O Gradle solution da documentação do Spring Boot não é 100% compatível com a propriedade Maven filtragem e expansão.

Para nos permitir usar o mecanismo de expansão de propriedade, precisamos incluir o seguinte código em build.gradle:

processResources {
    expand(project.properties)
}

Esta é uma solução limitada com as seguintes diferenças da configuração padrão do Maven:

  1. Não suporta propriedades com pontos (por exemplo, user.name) . Gradle entende pontos como delimitadores de propriedades de objetos

  2. Filtra todos os arquivos de recursos e não apenas um conjunto específico de arquivos de configuração

  3. Usa os espaços reservados padrão com cifrão _ $ \ {…} _ conflitando com os espaços reservados padrão do Spring

====* 3.2 Solução compatível com Maven *

Para replicarmos a solução padrão do Maven e usarmos os espaços reservados no estilo _ @… @ , precisamos adicionar o seguinte código ao nosso _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])
            }
        }
    }
}

Isso resolverá todas as propriedades do projeto. Ainda não podemos definir propriedades com pontos (por exemplo, user.name) em o build.gradle, mas agora podemos usar o arquivo gradle.properties para definir propriedades no formato padrão de propriedades Java e também suporta propriedades com pontos (por exemplo, database.url) .

Essa compilação filtra apenas os arquivos de configuração do projeto e não todos os recursos, e é 100% compatível com a solução Maven.

4. Conclusão

Neste tutorial rápido, vimos como expandir automaticamente as propriedades do Spring Boot usando os métodos de construção Maven e Gradle e como podemos migrar facilmente de um para o outro.

O exemplo completo da fonte pode ser encontrado over no GitHub.