Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Alteração de variáveis de ambiente

Preciso modificar o valor de uma variável de ambiente, contudo utilizar o @Value e alterar no application.properties estão fora de questão.

Acabei me deparando com estes dois métodos, contudo ambos me retornar que o valor armazenado é "null".

Método 1

private static Map getModifiableEnvironment() throws Exception{
        Class pe = Class.forName("java.lang.ProcessEnvironment");
        Method getenv = pe.getDeclaredMethod("getenv");
        getenv.setAccessible(true);
        Object unmodifiableEnvironment = getenv.invoke(null);
        Class map = Class.forName("java.util.Collections$UnmodifiableMap");
        Field m = map.getDeclaredField("m");
        m.setAccessible(true);
        return (Map) m.get(unmodifiableEnvironment);
    }

    private static void environmentSet() throws Exception {

        getModifiableEnvironment().put("minhaVariavel", "umValor");
        System.out.println(System.getenv("minhaVariavel"));
        }

Método 2

  /*  private static void set_up_environment_var() throws IOException{
        try {

            Process process = Runtime.getRuntime().exec("set", new String[]{"minhaVariavel=umValor"});
            System.out.println(System.getenv("minhaVariavel"));
            BufferedReader stdInput = new BufferedReader(new
                    InputStreamReader(process.getInputStream()));

            BufferedReader stdError = new BufferedReader(new
                    InputStreamReader(process.getErrorStream()));

            System.exit(0);
        }
        catch (IOException | InterruptedException e) {
            System.out.println("exception happened - here's what I know: ");
            e.printStackTrace();
            System.exit(-1);
        }
    }

Alguma sugestão de como modificar essa variável ?

2 respostas
solução!

Eu uso a classe Properties para isso. Veja: java.util.Properties

O meu código:


public abstract class Ambiente {
    private static Logger logger = LogManager.getLogger(Ambiente.class);

    private static final String ENV_VARIABLE_NAME = "PROJECTBASE_ENV";
    private static final String ENV_PROD = "envProd.properties";
    private static final String ENV_DESENV = "envDesenv.properties";
    private static final String ENV_HOMOL = "envHomol.properties";
    private static Properties applicationProperties;

    private Ambiente() {
        throw new IllegalStateException("Utility class");
    }

    private static String getVariavelAmbiente() {
        String ambiente = System.getProperty(ENV_VARIABLE_NAME);
        logger.info("Aplicação rodando no ambiente: " + ambiente);
        return ambiente;
    }

    private static Properties getPropertisConfiguracao() {
        if (Objects.nonNull(applicationProperties)) {
            return applicationProperties;
        }
        String env = getVariavelAmbiente() == null ? " " : getVariavelAmbiente(); 

        switch (env) {
        case "desenv":
            applicationProperties = getCustomProperties(ENV_DESENV);
            return applicationProperties;
        case "homol":
            applicationProperties = getCustomProperties(ENV_HOMOL);
            return applicationProperties;
        case "prod":
            applicationProperties = getCustomProperties(ENV_PROD);
            return applicationProperties;
        default:
            applicationProperties = getCustomProperties(ENV_DESENV);
            return applicationProperties;
        }
    }

    public static boolean isEnvironmentProduction() {
        return getVariavelAmbiente().equals("prod");
    }

    private static Properties lerLocalProperties(String env) {
        Properties properties = new Properties();
        try {
            InputStream inputStream = Ambiente.class.getClassLoader().getResourceAsStream(env);
            properties.load(inputStream);
        } catch (IOException e) {
            logger.error("Falha ao ler o properties de configuracao", e);
        }
        return properties;
    }

    private static Properties getCustomProperties(String env) {
        Properties properties = lerLocalProperties(env);
        properties.setProperty("DIRETORIO_ARQUIVOS", File.listRoots()[0].getAbsolutePath() + File.separator + "data" + File.separator + "uploads");
        properties.setProperty("DIRETORIO_CONFIGURACOES", File.listRoots()[0].getAbsolutePath() + File.separator + "data" + File.separator + "configuracoes");

        return properties;
    }

    public static String getDiretorioArquios() {
        return getPropertisConfiguracao().getProperty("DIRETORIO_ARQUIVOS");
    }

    public static String getDiretorioConfiguracoes() {
        return getPropertisConfiguracao().getProperty("DIRETORIO_CONFIGURACOES");
    }

    public static String getUrlAutorizacao(){
        return getPropertisConfiguracao().getProperty("URL_AUTORIZACAO");
    }

    public static String getUrlAutenticacao(){
        return getPropertisConfiguracao().getProperty("URL_AUTENTICACAO");
    }

    public static String getPublicHost() {
        return getPropertisConfiguracao().getProperty("PUBLIC_HOST");
    }

    public static String getTimeZone() {
        return getPropertisConfiguracao().getProperty("TIME_ZONE");
    }
}

Esse exemplo aqui está mais fácil de entender: baeldung

Parece que estava tentado resolver de forma equivocada ><as opções que fazem mais sentido são pelo @Value (compreendi errado que não poderia usar, quando na verdade é o melhor método) e a outra é mudar as configurações (edit configurations no eclipse) de como o programa será rodado localmente .