繁体   English   中英

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

[英]How do I set up a Java Environment Variable in a Spring Boot / Gradle / IntelliJ Environment?

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

首先,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 设置中:

在此处输入图片说明

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

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

}

首先,你可能更喜欢使用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和其他此类任务时./gradlew bootRun

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM