在 applicationContext.xml 中配置:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/jdbc-${WEB_ENVIRONMENT}.properties</value>
<value>classpath:/settings-${WEB_ENVIRONMENT}.properties</value>
</list>
</property>
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"></property>
<property name="searchSystemEnvironment" value="true"></property>
</bean>
我已经在我的用户和 root 的 .bashrc 文件中设置了环境变量,就像这样
export WEB_ENVIRONMENT=prod
在启动 tomcat 时出现错误
org.springframework.beans.factory.BeanInitializationException: Could not load properties; nested exception is java.io.FileNotFoundException: class path resource [jdbc-${WEB_ENVIRONMENT}.properties] cannot be opened because it does not exist
我也试过这样:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/jdbc-#{T(java.lang.System).getenv('WEB_ENVIRONMENT')}.properties</value>
<value>classpath:/settings-#{T(java.lang.System).getenv('WEB_ENVIRONMENT')}.properties</value>
</list>
</property>
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"></property>
<property name="searchSystemEnvironment" value="true"></property>
</bean>
这次我得到了错误
Caused by: java.io.FileNotFoundException: class path resource [jdbc-.properties] cannot be opened because it does not exist
这意味着 SpEL 在 applicationContext.xml 中可以正常工作,但无法从系统环境中获取变量。
为了检查值是否设置正确,我运行echo ${WEB_ENVIRONMENT}
并正确返回了值。因此,要检查 java 是否能够从我运行的环境中获取值
public class Test {
public static void main(String[] args) {
System.out.println(System.getenv("WEB_ENVIRONMENT"));
}
}
这也正确返回了“prod”
两个版本都在 Windows 中运行,但不在 Amazon EC2 的 Linux AMI中。
接下来我应该怎么做才能让它工作?