[英]Set Environment Variable with Spring Boot Gradle plugin and IntelliJ
[英]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 环境中使用。 这是我尝试过的:
export DATABASE_URL=jdbc:postgresql...
到/etc/environment
-DDATABASEURL=jdbc:postgresql...
添加到我的 gradle 任务 VM 选项(使用 bootRun.systemProperties = System.properties)首先,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.