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>
ユーザーとルートの両方の.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 では実行されません。
それを機能させるために次に何を試すべきですか?