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:
-
Não suporta propriedades com pontos (por exemplo, user.name) . Gradle entende pontos como delimitadores de propriedades de objetos
-
Filtra todos os arquivos de recursos e não apenas um conjunto específico de arquivos de configuração
-
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.