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>

我已经在我的用户和 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中。

接下来我应该怎么做才能让它工作?

4

2 回答 2

1

我知道的几个选项,

  1. 尝试在启动应用程序时将其设置为 VM Arguments。IE-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在 shell ( USER) 上列出。结果如预期:

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

您可以按照此处的建议设置环境变量。另一种方法是添加变量以将其添加到 /etc/profile 全局添加 env 变量。前者是首选。

于 2013-03-06T19:51:36.457 回答