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

标签 spring configuration architecture war

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

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

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

最近我遇到了一个运营商的问题: “那么,如果数据库在 preprod 环境中发生更改,我们真的必须在构建服务器上生成具有适当配置文件的新构建吗?” 我回答'不,您实际上可以转到 .../webapps/currentApp/WEB-INF/classes/config/application.properties 并更改那里的值,然后重新启动容器'

我们提出了一个解决方案,可以解决此问题的某些方面: 使用 Maven 程序集插件,我们将 Jetty inside 嵌入到 war 中,使其可用作“可执行” war ,也使我们能够拥有全局配置 XML, 嵌入式 Jetty 的启动器从中创建/修改展开的 war 目录中的适当 .properties 文件,然后才启动应用程序。

但是,如果您想使用 Jetty 以外的任何其他东西,这也不能解决问题。

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

最佳答案

环境变量,外部配置文件

我们有类似的东西,一个在 Tomcat/Weblogic 中运行的 Web 应用程序和 Spring。 我们所做的是定义一个 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 配置中像往常一样引用所有变量。

在 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 团队部署相同的工件及其相应的环境文件。如果有什么事情发生了,我们知道它只是环境。乱七八糟的属性。 高温

关于spring - Spring Web 应用程序中配置文件的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5967405/

相关文章:

configuration - Dropwizard 集成测试 : config resource file not found

java - 如何在 Spring Boot 应用程序中使用多个 mongodb 数据库?

algorithm - 使用通配符管理配置树的好算法?

architecture - 静态 View 模型/表示模型

java - 使用 Autowiring 字段的 Junit 测试

java - 测试时的 log4j 配置仅显示错误

Java Spring Web 序列化子类的属性

c# - 如何实现复杂的 UI 逻辑?

saas - 建立一个门户网站,该门户网站将出租给客户。需要架构建议

spring - Spring MVC错误404错误请求Kotlin