gpt4 book ai didi

java - Spring Boot 不替换 application.properties 文件中的环境变量

转载 作者:行者123 更新时间:2023-12-01 06:05:43 30 4
gpt4 key购买 nike

我正在尝试使用 SpringBoot 运行 Quartz Scheduler。使用 Quartz Jdbc 数据存储。出于安全原因,我们希望从属性文件中选择数据库凭据。根据我从这里( Using env variable in Spring Boot's application.properties )和 springBoot 文档的理解,SpringBoot 自动替换 application.properties 中的环境变量,但我没有看到这个。这是我在运行应用程序之前获取的系统环境文件

export DB_HOST=localhost
export DB_PORT=11111
export DB_USER=root
export DB_PASSWORD=root
export QUARTZ_DB_NAME=quartz

这是我的 application.properties

org.quartz.dataSource.quartzDataSource.URL =jdbc:mysql://${DB_HOST}:${DB_PORT}/${QUARTZ_DB_NAME}
org.quartz.dataSource.quartzDataSource.user = ${DB_USER}
org.quartz.dataSource.quartzDataSource.password = ${DB_PASSWORD}

还有我的配置类

@Configuration
public class ConfigureQuartz {

@Autowired
private ApplicationContext applicationContext;

@Bean
public SchedulerFactoryBean schedulerFactoryBean() throws IOException
{
final SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();
quartzScheduler.setSchedulerName("mdsScheduler");

quartzScheduler.setQuartzProperties(quartzProperties());
final AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
quartzScheduler.setJobFactory(jobFactory);
return quartzScheduler;
}



@Bean
public Properties quartzProperties() throws IOException {
final PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
propertiesFactoryBean.setLocation(new ClassPathResource("/application.properties"));
propertiesFactoryBean.afterPropertiesSet();
return propertiesFactoryBean.getObject();

}

但是当我使用 java -jar <>.java 运行我的 spring 应用程序时,我没有看到替换的值。

我可以通过使用 System.getEnv() 读取值来解决此问题,但如果可以替换这些值,那就太好了。不知道为什么它不起作用:(

最佳答案

Spring-boot允许我们通过多种方式提供外部化配置,你可以尝试使用application.yml或者yaml文件来代替property文件,并根据不同的环境提供不同的property文件设置。我们可以将每个环境的属性分离到单独的 spring 配置文件下的单独的 yml 文件中。然后在部署期间您可以使用:

java -jar -Drun.profiles=SpringProfileName

指定要使用的 spring 配置文件。请注意,yml 文件的名称应类似于

application-{environmentName}.yml

让 springboot 自动占用它们。引用:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties

从 application.yml 或属性文件中读取:

从属性文件或yml中读取值的最简单方法是使用spring @value注解。Spring会自动将yml中的所有值加载到spring环境中,因此我们可以直接使用来自环境的这些值例如:

@Component
public class MyBean {

@Value("${name}")
private String name;

// ...

}

或者spring提供的另一种读取强类型bean的方法如下:

YML

acme:
remote-address: 192.168.1.1
security:
username: admin
roles:
- USER
- ADMIN

对应POJO读取yml:

@ConfigurationProperties("acme")
public class AcmeProperties {

private boolean enabled;

private InetAddress remoteAddress;

private final Security security = new Security();

public boolean isEnabled() { ... }

public void setEnabled(boolean enabled) { ... }

public InetAddress getRemoteAddress() { ... }

public void setRemoteAddress(InetAddress remoteAddress) { ... }

public Security getSecurity() { ... }

public static class Security {

private String username;

private String password;

private List<String> roles = new ArrayList<>(Collections.singleton("USER"));

public String getUsername() { ... }

public void setUsername(String username) { ... }

public String getPassword() { ... }

public void setPassword(String password) { ... }

public List<String> getRoles() { ... }

public void setRoles(List<String> roles) { ... }

}
}

上述方法适用于 yml 文件。

引用: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

从环境中读取:

如果您在 Linux 上运行应用程序,请按如下方式设置环境:

export DB_HOST=localhost
export DB_PORT=11111
export DB_USER=root
export DB_PASSWORD=root
export QUARTZ_DB_NAME=quartz

如果您使用的是 Windows,请将其设置为:

SET DB_HOST=localhost
SET DB_PORT=11111
SET DB_USER=root
SET DB_PASSWORD=root
SET QUARTZ_DB_NAME=quartz

在您的 application.properties 中,如果您保留如下键,它应该自动解析环境中的值:

spring.datasource.url = ${DB_HOST}/"nameofDB"
spring.datasource.username = ${DB_USER}
spring.datasource.password = ${DB_PASSWORD}

关于java - Spring Boot 不替换 application.properties 文件中的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45216494/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com