0

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 では実行されません

それを機能させるために次に何を試すべきですか?

4

2 に答える 2

1

私が知っているいくつかのオプション、

  1. アプリケーションの起動時に VM 引数として設定してみてください。すなわち-DWEB_ENVIRONMENT=prod

  2. Tomcat の場合は、JAVA_OPTSこの回答を参照して設定し、それを達成する方法を見つけることができます。

  3. 私自身のプロジェクトでは、環境変数の値をcatalina.properties最後に設定して、 -Druntime_env=dev.

于 2013-03-06T19:23:37.180 に答える
1

最初の試みでは、鶏と卵の問題があると思います。PropertyPlaceholderConfigurerプロパティに置き換える必要がある値を使用して構成する必要があります。これはうまくいきません!

SpEL アプローチは機能するはずです。Mac (UNIX のようなシステム) でprintenv、シェル ( USER) にリストされた値を使用して、同様の構成を試しました。結果は期待どおりです。

java.io.FileNotFoundException: class path resource [settings-arne.properties] cannot be opened because it does not exist

ここで提案されているように、環境変数を設定できます。もう 1 つの方法は、変数を追加して /etc/profile に追加し、env 変数をグローバルに追加することです。前者が好ましい。

于 2013-03-06T19:51:36.457 に答える