【问题标题】:How do I set up a Java Environment Variable in a Spring Boot / Gradle / IntelliJ Environment?如何在 Spring Boot / Gradle / IntelliJ 环境中设置 Java 环境变量?
【发布时间】:2016-07-10 21:51:45
【问题描述】:

我正在尝试在我的开发环境中设置一个配置来加载 DATABASE_URL,该配置也可以在 Heroku 上使用 Heroku 的 DATABASE_URL。不幸的是,我试图创建本地环境变量的所有技术似乎都不适用于我的 Gradle/Boot/IntelliJ 环境。这是我尝试过的:

  1. 将export DATABASE_URL=jdbc:postgresql... 添加到/etc/environment
  2. 将 -DDATABASEURL=jdbc:postgresql... 添加到我的 gradle 任务 VM 选项(使用 bootRun.systemProperties = System.properties)
  3. 下面是我的临时答案,我真的不喜欢。

【问题讨论】:

    标签: java heroku environment-variables


    【解决方案1】:

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

    http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

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

        //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 设置中:

    【讨论】:

      【解决方案2】:

      我正在用我所拥有的最佳答案来回答我自己的问题,但真的 希望有更好的接受!

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

      localDatabaseUrl=postgres://postgres:postgres@127.0.0.1:5432/Nitro
      

      如果我没有找到 DATABASE_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;
          }
      
      }
      

      【讨论】:

        【解决方案3】:

        首先,您可能更喜欢使用JDBC_DATABASE_URL,如Heroku DevCenter 中所述。

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

        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 和其他此类任务时无济于事。

        【讨论】:

        • 感谢@codefinger。我知道在 Ubuntu 上创建 Java 可以读取的环境变量还有更好的方法。就等着吧。
        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-04-03
          • 2020-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-16
          • 2019-08-03
          • 2019-08-09
          • 2012-02-06
          相关资源
          最近更新 更多