首页 文章

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

提问于
浏览
10

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

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

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

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

我们已经提出了一个解决这个问题的一些方面的解决方案:使用Maven程序集插件我们在战争中嵌入了一个Jetty,这使得它可以用作'executable'战争,也让我们有可能拥有一个全局配置XML,从中嵌入式Jetty的启动程序在展开的war目录中创建/修改相应的.properties文件,然后才启动应用程序 .

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

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

3 回答

  • 2

    环境变量,外部配置文件

    我们有一些类似的东西,一个用Spring运行在Tomcat / Weblogic中的Web应用程序 . 我们要做的是定义一个environment property 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>
    

    在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>
    

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

  • 10

    数据库

    开发人员一旦进入我工作的环境就无法触及WAR,因此如果我们需要更改配置值而不重新部署,我们会将其放入关系数据库中 .

    这些不需要重新打包,重新部署或退回服务器 . 但应用程序必须定期刷新只读配置 .

    JNDI

    JNDI设置从环境到环境保持不变;这些更改由应用服务器管理员设置一次,不会更改 . (见Oracle Tutorial

    我正在谈论用于配置应用程序本身的名称/值对,而不是JNDI .

  • 4

    对于数据来源;在tomcat上下文中,创建JNDI资源条目并将资源条目/配置与应用程序分离是一种常见方法 . 如果更改了DB,则可以在容器(Tomcat,Jetty等)中重新配置JNDI资源并重新启动 . 如果您有一个容器场,那么重新启动tomcat实例不会有问题 . 您可以在负载均衡器上停用它们并重新启动,重新激活 . 我认为Jetty中还有一个上下文文件,您可以在其中添加JNDI资源 . 此外,还有针对属性的maven配置文件,这取决于不同的上下文 . 您可以使用maven的“-P”参数选择您的配置文件,并且您的项目将使用这些配置构建,例如针对不同的目标上下文,如live和test .

相关问题