如何在Spring Boot/Gradle/IntelliJ环境中设置Java环境变量?

如何在Spring Boot/Gradle/IntelliJ环境中设置Java环境变量?,java,heroku,environment-variables,Java,Heroku,Environment Variables,我正在尝试在我的开发环境中设置一个配置,以加载同样适用于Heroku的数据库URL,以及Heroku的数据库URL。不幸的是,我试图创建本地环境变量的技术中没有一种似乎在我的Gradle/Boot/IntelliJ环境中起作用。以下是我尝试过的: 将导出数据库添加到/etc/environment 将-DDATABASEURL=jdbc:postgresql…添加到我的gradle任务VM选项(使用bootRun.systemProperties=System.properties) 下面是我的

我正在尝试在我的开发环境中设置一个配置,以加载同样适用于Heroku的数据库URL,以及Heroku的数据库URL。不幸的是,我试图创建本地环境变量的技术中没有一种似乎在我的Gradle/Boot/IntelliJ环境中起作用。以下是我尝试过的:

  • 将导出数据库添加到
    /etc/environment
  • -DDATABASEURL=jdbc:postgresql…
    添加到我的gradle任务VM选项(使用bootRun.systemProperties=System.properties)
  • 下面是我的临时答案,我真的不喜欢
  • 我用我最好的答案回答了我自己的问题,但是真的 希望有一个更好的可以接受

    我的每个环境都有不同的属性文件。在development.properties中,我添加了

    localDatabaseUrl=postgres://postgres:postgres@127.0.0.1:5432/Nitro
    
    如果我没有找到数据库URL环境变量,那么我只是从属性文件中读取该变量:

    @Configuration
    public class DatabaseConfig {
    
        @Value("${localDatabaseUrl}")
        String localDatabaseUrl;
    
        private static final Logger log = LoggerFactory.getLogger(DatabaseConfig.class);
    
        @Bean
        public BasicDataSource dataSource() throws URISyntaxException {
    
            URI dbUri;
            try {
                dbUri = new URI(System.getenv("DATABASE_URL"));
                log.info("Connecting via DATABASE_URL environment variable");
            } catch (NullPointerException ex) {
                dbUri = new URI(localDatabaseUrl);
                log.info("Connecting via localDatabaseUrl properties key/value ***");
            }
    
            String username = dbUri.getUserInfo().split(":")[0];
            String password = dbUri.getUserInfo().split(":")[1];
            String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath();
    
            BasicDataSource basicDataSource = new BasicDataSource();
            basicDataSource.setUrl(dbUrl);
            basicDataSource.setUsername(username);
            basicDataSource.setPassword(password);
    
            return basicDataSource;
        }
    
    }
    

    首先,您可能更喜欢使用中所述的
    JDBC\u DATABASE\u URL

    也就是说,任何一个变量都可以。我还认为后备逻辑也不错。但我可能会这样做:

    if (null == System.getenv("JDBC_DATABASE_URL")) {
      dbUri = new URI(System.getenv("JDBC_DATABASE_URL"));
    } else {
      dbUri = new URI(localDatabaseUrl);
    }
    
    另一种方法是使用
    .env
    文件和
    heroku local
    命令。您的
    .env
    文件将包含:

    JDBC_DATABASE_URL=postgres://...
    

    heroku local
    命令将使用
    Procfile
    中的命令运行应用程序。但这在使用
    /gradlew bootRun
    和其他类似任务时没有帮助。

    首先,Spring可以自动解析环境变量,其次,将根据此处定义的顺序解析变量(这是一个Spring启动文档页,但对于非启动项目也应如此):

    在Heroku中将变量设置为Environment vars将覆盖属性文件中的版本,无需任何进一步编码:

        //these properties will be resolved automatically from Heroku env vars if present
        //otherwise will be resolved from properties file bundled in the WAR
        @Value("${database.url}")
        String databaseUrl;
    
        @Value("${database.user}")
        String databaseUser;
    
        @Value("${database.password}")
        String databasePassword;
    
        @Bean
        public BasicDataSource dataSource() throws URISyntaxException {
    
            BasicDataSource basicDataSource = new BasicDataSource();
            basicDataSource.setUrl(databaseUrl);
            basicDataSource.setUsername(databaseUser);
            basicDataSource.setPassword(databasePassword);
    
            return basicDataSource;
        }
    }
    
    通过某种方式将本地属性文件中要覆盖的变量添加到应用程序的Heroku设置中:


    实际上,您可以使用以下命令非常轻松地设置由Spring“可见”的Heroku系统变量:

    heroku config:set database.url=myDatabaseUrl -a myHerokuApp
    

    谢谢@codefinger。我知道还有更好的方法可以在Ubuntu上创建Java可以读取的环境变量。就等着吧。