处理Spring Web应用程序中的配置文件

aba*_*ogh 10 architecture configuration spring war

我有几次遇到同样的问题,我想对其他人对此问题的看法有一些意见:假设我们将Spring应用程序打包为.war文件,我们希望在多个环境中运行它.(开发/测试/ preprod/PROD /等)

为了访问应用程序所需的基础结构(数据库/ web服务等),我们将访问信息存储在配置文件中,某些业务配置也在这些文件中.假设我们为此目的使用.properties文件(因为我们在战争中有一个弹簧应用程序,我们喜欢在appcontext中通过单行读取属性)并且还假设在不同的环境中我们没有相同的appserver/servlet容器.(例如:dev,test:jetty,preprod:tomcat,prod:glassfish)

我通常做的是创建多个Maven配置文件,每个环境一个,每个环境的相应文件中需要的配置.

现在我最近遇到了一个运行操作的人的问题:'如果在preprod环境中更改了数据库,我们真的必须在构建服务器上生成一个具有相应配置文件的新构建吗?' 我回答"不,你实际上可以去.../webapps/currentApp/WEB-INF/classes/config/application.properties并更改那里的值,然后重新启动容器"

我们已经想出了解决了这一问题的某些方面的解决方案:使用Maven Assembly插件,我们嵌入一个码头这使得它可以作为一个"可执行文件"战争之战,也让我们有一个全球性的XML配置的可能性,从嵌入式Jetty的启动程序在爆炸的war目录中创建/修改相应的.properties文件,然后才启动应用程序.

但是如果你想使用除Jetty以外的任何其他东西,这也无法解决问题.

每个人如何处理同样的情况?

Raj*_*dra 10

环境变量,外部配置文件

我们有一些类似的东西,一个用Spring运行在Tomcat/Weblogic中的Web应用程序.我们要做的是定义一个环境属性 CONFIG_PATH,并将所有XML(包括spring配置)和属性文件放在该目录中.

我们有多个属性文件(每个环境),我们将其作为tar文件发送.Web应用程序从CONFIG_PATH目录加载所有Properties/Spring配置文件.此变量在相应环境中定义为环境变量

这样我们就不会触及WAR文件,也不会为环境构建单独的WAR.想想这个场景:QA和PROD WAR文件构建,QA测试QA war文件,PROD WAR部署在PROD中,但有些东西爆炸:(

我们做如下的事情:

在spring config xml中,我们定义:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="order" value="0"></property>
    <property name="locations">
        <list>
            <value>file:${CONFIG_PATH}/App.properties</value>
        </list>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

在spring config中照常引用所有变量.

在web.xml中我们定义spring配置如下:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>file:${CONFIG_PATH}/**/spring-config.xml
    </param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

QA/PROD团队使用相应的环境文件部署相同的工件.如果事情爆发,我们知道它只有环境.混乱的属性.HTH