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

时间:2016-07-10 21:51:46

标签: java heroku environment-variables

我正在尝试在我的开发环境中设置一个配置来加载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. 我的转换答案如下,我真的不喜欢。

4 个答案:

答案 0 :(得分:1)

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

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

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

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

enter image description here

答案 1 :(得分:0)

  

我用我最好的答案回答了我自己的问题,但是真的   希望有更好的人接受!

我的每个环境都有不同的属性文件。在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;
    }

}

答案 2 :(得分:0)

首先,您可能更喜欢使用Heroku DevCenter中描述的JDBC_DATABASE_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和其他此类任务时,这无济于事。

答案 3 :(得分:0)

实际上,您可以非常轻松地设置Heroku系统变量,这些变量是“可见的”#34;由Spring使用此命令:

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