[Maven+Java] Lendo Arquivos de Resource a partir de Programas Java

Muitas vezes precisamos lidar com a leitura de propriedades de arquivos de resource, principalmente para evitar hardcoded strings espalhadas pelas classes do projeto. Neste post iremos aprender a ler propriedades programaticamente através de um exemplo onde precisamos obter os valores dos campos username e password de um usuário.
Vamos criar um projeto Maven chamado reading-properties com o archetype quickstart para tirarmos proveito das configurações-padrão do Maven em relação a diretórios de código e resources e evitar ter que configurar a localização dos arquivos no classpath manualmente.
$ mvn archetype:generate -DgroupId=org.andgomes
-DartifactId=reading-properties
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-quickstart
-DarchetypeVersion=1.1 -DinteractiveMode=falseAntecipando a compilação da classe que irá ler as propriedades do arquivo de resources, vamos configurar a versão do Java utilizada pelo Maven através das propriedades no arquivo POM para a versão 1.7.
Agora vamos criar o arquivo my.properties e salvá-lo no diretório src/main/resources, o diretório padrão de arquivos de resources.
Com tudo pronto, nosso objetivo é ler o arquivo my.properties e exibir os valores das duas propriedades. Para isso, vamos criar a classe PropertiesReader que utiliza a classe Properties para extrair os valores das propriedades do arquivo. A classe deve ser salva no diretório src/main/java/org/andgomes.
Primeiro abrimos o arquivo como um InputStream utilizando o método getResourceAsStream() através do class loader da nossa classe e em seguida carregamos e lemos cada propriedade com os métodos load() e getProperty(), respectivamente.
Vamos compilar a nossa classe e executá-la com o Maven.
$ mvn compile
$ mvn exec:java -Dexec.mainClass="org.andgomes.PropertiesReader"-------------------------------
Username: andgomes
Password: qwe123
-------------------------------
[INFO] BUILD SUCCESS
Perceba que precisamos especificar um class literal(PropertiesReader.class) porque estamos em um método estático. Ser precisarmos carregar o InputStream dentro de um método não estático, podemos acessar a classe com o método getClass(). Por exemplo, poderíamos implementar um método que retorna os valores das propriedades de um arquivo da seguinte maneira:
