[Maven] Filtrando Arquivos de Resource

No post anterior, vimos como copiar arquivos de recurso para o diretório de classes. Porém, da forma como vimos, o arquivo tem que ser estático, ou seja, não há a possibilidade de o conteúdo do arquivo ser alterado para atender às necessidades específicas de cada ambiente. Por exemplo, em determinado projeto, poderíamos ter que salvar o caminho do banco de dados da aplicação em um arquivo de recurso separado. Esse caminho não necessariamente será o mesmo em todos os ambientes de execução.

O problema da localização do banco de dados pode ser resolvido pelo menos de duas maneiras diferentes. A primeira maneira de resolver é obrigando cada programador a alterar o arquivo manualmente. Se o projeto for mantido em um ambiente de versionamento, toda vez que houver uma sincronização o arquivo terá que ser alterado. A segunda maneira é utilizando a filtração de recursos. Com a filtração de recursos, podemos utilizar placeholders para os dados que dependem do ambiente de execução.

Como exemplo de uso da filtração de recursos, vamos criar um arquivo que contém o nome do programador e o sistema operacional que ele está utilizando. O arquivo terá o seguinte conteúdo:

A sintaxe de um placeholder segue a estrutura ${nome.do.campo}. Por convenção, o caractere ponto(.) é utilizado como separador.

Agora precisamos de um arquivo onde o nome do programador fique armazenado e esteja disponível para que o Maven substitua o campo programmer.name quando copiar o recurso. Poderíamos escolher o arquivo POM, porém o problema de cada programador ter que alterar o arquivo a cada sincronização não seria resolvido, porque o POM de um projeto é compartilhado entre todos os programadores.

Vamos criar um arquivo chamado settings.xml no diretório .m2, que é o repositório local onde o Maven armazena os plugins que são baixados. O diretório .m2 é um hidden directory(para vê-lo precisamos digitar ctrl+h) localizado em /home/username. Como cada programador terá um arquivo settings.xml separado, esse arquivo só precisa ser alterado uma vez.

Criamos um perfil(profile) com o id programmer e definimos esse perfil como ativo na seção activeProfiles para que a propriedade programmer.name seja configurada em toda operação de build. Se o perfil não estiver ativo durante o build, a propriedade não será configurada e o Maven não substituirá o campo correspondente no arquivo de recurso. Note que o nome da propriedade é igual ao nome do placeholder no arquivo programmer-resouce.txt.

Já temos a propriedade configurada, agora só precisamos ativar a filtração de recursos no arquivo POM.

Agora vamos executar o comando para compilar o código-fonte. Lembre-se que, de acordo com o lifecycle default, o Maven invoca a fase process-resources antes da fase compile.

$ mvn compile

O arquivo programmer-resource.txt será copiado para o diretório target/classes/ com os campos substituídos por seus respectivos valores.

Perceba que nós precisamos definir o valor para a propriedade programmer.name mas não precisamos para os campos os.name e os.version. O motivo disso é que algumas propriedades já são pré-definidas e acessíveis pelo Maven. Três variáveis são disponibilizadas para acessar essas propriedades:

  • env.*: permite acessar as variáveis de ambiente do sistema operacional. Exemplos: env.PATH, env.M3_HOME e env.JAVA_HOME.
  • project.*: permite acessar as propriedades do projeto definidas no arquivo POM. Exemplos: project.version e project.artifactId.
  • settings.*: permite acessar as propriedades do arquivo .m2/settings.xml. Exemplos: settings.offline e settings.localRepository.

Além dessas, todas as propriedades que podem ser obtidas pelo método getProperty() da classe java.lang.System também estão disponíveis. No arquivo programmer-resource.txt utilizamos duas delas: os.name e os.version.