【问题标题】:Spring PropertyPlaceholderConfigurer in LinuxLinux 中的 Spring PropertyPlaceholderConfigurer
【发布时间】:2013-02-21 16:12:23
【问题描述】:

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 中

接下来我应该怎么做才能让它发挥作用?

【问题讨论】:

  • 另请注意,#{systemProperties['WEB_ENVIRONMENT']} 也不起作用
  • 你是如何在 EC2 中启动 tomcat 的?
  • sudo 服务 tomcat7 启动。虽然更愿意在环境中设置它而不是传递 -D 参数
  • 哪个用户正在运行tomcat(在ps auxwww中查找java处理)?我认为 env var 没有被拾取,例如如果不使用 bash 启动 tomcat 或其他用户正在运行 tomcat。
  • tomcat 也作为服务安装,在启动时运行。不知何故,ps auxwww 将 tomcat 显示为运行 tomcat 的用户!我是 linux 的菜鸟,所以不知道这意味着什么..

标签: java linux spring amazon-ec2 spring-el


【解决方案1】:

我知道的选项很少,

  1. 尝试在启动应用程序时将其设置为 VM 参数。 即-DWEB_ENVIRONMENT=prod

  2. 如果是 Tomcat,您可以在 JAVA_OPTS 中设置它,请参阅此 answer 以了解如何实现。

  3. 在我自己的项目中,我将catalina.properties 中的环境变量值设置在最后,通过输入-Druntime_env=dev

【讨论】:

  • catalina.sh 文件在哪里?我似乎在 ${CATALINA_HOME}/bin 文件夹中找不到它。
  • 个人建议,不要编辑 catalina.sh 而是更新 ${CATALINA_HOME}/conf 下的 catalina.propertis
【解决方案2】:

我认为,对于第一次尝试,您遇到了母鸡和鸡蛋的问题。您想使用需要替换为属性的值来配置PropertyPlaceholderConfigurer。这行不通!

SpEL 方法应该可以工作,我只是在我的 mac(类 UNIX 系统)上尝试了一个类似的配置,其值在 shell (USER) 上由 printenv 列出。结果如预期:

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

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

【讨论】:

  • 嗯.. 你认为这与 EC2 实例上的 Linux 发行版有关吗?
  • @VarunAchar:你有本地和远程相同的 Tomcat 版本吗?和相同的配置(context.xml,...)?
  • 这两个地方都是库存的tomcat配置。相同版本
猜你喜欢
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 2014-06-22
  • 2012-02-18
  • 1970-01-01
  • 2010-12-08
相关资源
最近更新 更多