弹簧启动应用的外部配置

2022-09-01 08:12:13

我有一个弹簧启动应用程序,我想用外部配置文件运行。当我把它作为jar(带有嵌入式servlet容器)运行时,一切都很好。但是我想在外部servlet容器(Tomcat)下运行它,在这里我有外部配置的问题。我尝试过@PropertySource,但在这种情况下,应用程序只获得war文件配置中缺少的属性:外部配置不会覆盖内部配置。那么问题来了:如何配置将覆盖内部配置的外部配置?


答案 1

当您以 jar 形式运行应用程序时,您可能正在以当前目录的形式使用外部配置。但是,在外部tomcat中部署为战争时,“当前目录”并不是很有用。即使您找出当前目录是什么,对于在该tomcat中运行的所有应用程序,它很可能是相同的位置,因此当您运行多个应用程序时,这不会很好地工作。application.properties

我们在这里所做的是在我们的应用程序上声明二:PropertySources

@PropertySources({@PropertySource(value={"classpath:internal.properties"}), @PropertySource(value={"file:${application.properties}"})})

internal.properties包含属性的“内置”默认值。第二个是包含外部配置的文件。请注意,文件名本身是一个属性。PropertySource

我们在应用程序的元素(在tomcat中)中外部定义了这一点:Context

<Context docBase="/path/to/your/war/your.war">
    <Parameter name="application.properties" value="/path/to/your/properties/application.properties"/>
</Context>

这允许您在tomcat中运行多个应用程序,每个应用程序都使用自己的外部属性文件。您甚至可以让一应用程序的多个实例以不同的属性运行。


答案 2

Spring Boot提供了许多方法来指定属性的位置,不需要修改源代码。

Yo 可以定义 spring.config.location 值,例如:

  • 在上下文中描述符:tomcat/conf/Catalina/<host>

    <Context>
        <Parameter name="spring.config.location" value="/path/to/application.properties" />
    </Context>
    
  • 作为 tomcat 文件中的 JVM 参数:setenv.sh

    -Dspring.config.location=/path/to/application.properties
    
  • 作为环境变量。SPRING_CONFIG_LOCATION


推荐