如何在Spring Boot/Gradle/IntelliJ环境中设置Java环境变量?
我正在尝试在我的开发环境中设置一个配置,以加载同样适用于Heroku的数据库URL,以及Heroku的数据库URL。不幸的是,我试图创建本地环境变量的技术中没有一种似乎在我的Gradle/Boot/IntelliJ环境中起作用。以下是我尝试过的:如何在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) 下面是我的
/etc/environment
-DDATABASEURL=jdbc:postgresql…
添加到我的gradle任务VM选项(使用bootRun.systemProperties=System.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可以读取的环境变量。就等着吧。