3
respostas

Como ler variáveis de ambiente do .env com o

Estou fazendo o projeto do curso e gostaria de garantir que as credenciais do banco de dados não fiquem expostas no arquivo application.properties e não sejam enviadas para o GitHub. Para isso, estou tentando usar variáveis de ambiente para armazenar essas credenciais. No entanto, estou encontrando dificuldades.

Estou usando o Java Dotenv: Adicionei a dependência java-dotenv no meu pom.xml: io.github.cdimascio java-dotenv 5.2.2

Criei um arquivo .env na raiz do projeto com o seguinte conteúdo: SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/mydatabase SPRING_DATASOURCE_USERNAME=root SPRING_DATASOURCE_PASSWORD=password

Configurei o Arquivo application.properties: spring.datasource.url=${SPRING_DATASOURCE_URL} spring.datasource.username=${SPRING_DATASOURCE_USERNAME} spring.datasource.password=${SPRING_DATASOURCE_PASSWORD} spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

E usei o dotenv no Application.java:

    Dotenv dotenv = Dotenv.load();
    dotenv.get("SPRING_DATASOURCE_URL");
    dotenv.get("SPRING_DATASOURCE_USERNAME");
    dotenv.get("SPRING_DATASOURCE_PASSWORD");

Porém, parece que o Spring Boot não está substituindo a variável ${SPRING_DATASOURCE_URL} pelo valor correto da variável de ambiente com o seguinte erro ao tentar roda a aplicação: Driver com.mysql.cj.jdbc.Driver claims to not accept jdbcUrl, ${SPRING_DATASOURCE_URL}

Gostaria de saber como corrigir isso ou se teria alguma outra abordagem que faça o que quero.

3 respostas

Olá Beatriz! Tudo bem?

O erro que você está enfrentando ocorre porque o Spring Boot não está conseguindo substituir as variáveis de ambiente corretamente. Vamos tentar resolver isso juntos!

  1. Crie um arquivo .env na raiz do seu projeto:

    # formatado como chave=valor 
    MY_ENV_VAR1=algum_valor 
    MY_EVV_VAR2=algum_valor
    
  2. Vamos instalar a dependência responsável por coletar essa variável do env e levar para o código, (Para mais detalhes de uso, visite o repositório oficial):

    <dependency> 
        <groupId>io.github.cdimascio</groupId> 
        <artifactId>java-dotenv</artifactId> 
        <version>5.2.2</version> 
    </ dependency >
    
  3. Inicialize o dotenv com seus padrões e busque uma variável env:

    import io.github.cdimascio.dotenv.Dotenv
    Dotenv dotenv = Dotenv.load();
    dotenv.get(“MY_ENV_VAR1”)
    

    Para personalizar a configuração do dotenv, especifique algumas opções, como, por exemplo:

    Dotenv dotenv = Dotenv.configure()
        .directory("./some/path")
        .ignoreIfMalformed() // 
        .ignoreIfMissing()
        .load();
    

Ao fim você terá as variáveis do arquivo .env sendo acessadas em outros arquivos do seu projeto, ao ser importada.

Outra solução seria criar as variáveis de ambiente no seu próprio sistema, assim você conseguiria fazer a chamada delas diretamente no seu application.properties, precisando apenas passar o nome que você definiu:

spring.datasource.username=${NOME_DA_VARIAVEL}

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Olá, Armano! Tudo sim e com você? Fiz o que me pediu e o Dotenv está carregando corretamente e retornando os valores, mas ainda assim me retorna o erro: "Driver com.mysql.cj.jdbc.Driver claims to not accept jdbcUrl, ${SPRING_DATASOURCE_URL} ..."

Opa, Beatriz! Joia?

Cometi alguns equívocos na minha resposta anterior, os passos que passei era uma forma antiga de se utilizar variáveis de ambiente, então realmente causaria problema como o você teve.

Para me retratar trarei passos mais descritivos:

  1. Coloque o arquivo .env dentro da pasta "resources" já que ele se trata de um arquivo estático.

  2. Caso já não tenha feito anteriormente, adicione a dependência da lib de leitura de arquivos "env":

        <dependency>
            <groupId>io.github.cdimascio</groupId>
            <artifactId>java-dotenv</artifactId>
            <version>5.2.2</version>
        </dependency >
    
  3. Agora na classe Java que você pretende consumir as informações da variável presente no .env use a seguinte estrutura de código:

        public static void leitura() {
            Dotenv dotenv = Dotenv.configure()
                    .directory("src/main/resources/")
                    .filename(".env")
                    .load();
    
            System.out.println(dotenv.get("MY_ENV_VAR1"));
        }
    

Coloquei em um método apenas para testes, mas não é necessário. Nesse trecho faço a configuração do qual diretório estará o arquivo e qual será o seu nome, transformando assim a variável dotenv em um objeto Dotenv que retorna o valor das variáveis ao usar o método get passando o nome da variável.

Agora deve funcionar sem mais problemas!