提问者:小点点

如何在Tomcat webserver for Spring中外部化application.properties?


SpringApplication将从以下位置的application.properties文件中加载属性,并将它们添加到Spring环境中:

- A /config subdirectory of the current directory.
- The current directory
- A classpath /config package
- The classpath root

列表按优先级排序(列表中较高位置定义的属性会覆盖较低位置定义的属性)。

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files

问:在 tomcat 服务器上运行 war 文件时:如何在类路径或 tomcat 容器之外为应用程序属性添加其他位置,如 d:\application.properties

相对于上述位置,自定义位置应获得最高优先级。

问题是:我当然可以在tomcat webapps文件夹中的爆炸战争中添加一个/config文件夹,但是如果清理webapps文件夹并重新部署war,我会丢失任何自定义配置。

因此,我想在外面添加一个额外的位置。


共3个答案

匿名用户

对我来说,最简单的方法是将上下文文件放在Tomcat的配置文件夹中。例如,如果您的应用程序在根路径下运行(例如。your_domain.com/)您需要创建一个文件 [path_to_your_tomcat]/conf/卡塔利娜/本地主机/ROOT.xml。如果应用程序在不同的路径中运行,例如 http://your_domain.com/example_path则该文件应按以下方式命名 [path_to_your_tomcat]/conf/Catalina/本地主机/example_path.xml。在此文件中,您可以指定外部应用程序 .properties 文件的路径,该文件可以放置在硬盘驱动器上的任何位置。

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Environment name="spring.config.location" value="file:/path/to/your/application/properties/file/" type="java.lang.String"/>
</Context>

匿名用户

您可以设置指向包含应用程序的文件夹的spring_config_location环境变量。属性文件。

在Tomcat的情况下,您可以通过将以下行添加到您的来做到这一点

export spring_config_location=/usr/local/tomcat/conf/

将属性文件放在该文件夹中。如果您有多个应用程序,您可以将每个应用程序的属性文件名称设置为唯一。对于Spring Boot应用程序,我是这样做的:

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        System.setProperty("spring.config.name", "my-app");
        SpringApplication.run(MyApplication.class, args);
    }
}

这将选择新的名称时,运行与启动。要在Tomcat上部署时也配置名称,请覆盖< code > SpringBootServletInitializer 的configure,如下所示:

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyApplication.class).properties("spring.config.name: my-app");
    }

}

然后将属性文件命名为:< code>my-app.properties。Spring将寻找这个名字,而不是默认的名字。您可以将所有的应用程序属性文件放在指定的文件夹中,在我们的示例中为< code >/usr/local/Tomcat/conf/。您的外部属性将获得优先权。优先级见此:https://docs . spring . io/spring-boot/docs/current/reference/html/boot-features-external-config . html

更新

自Spring Boot 2以来,spring_config_location的行为发生了变化(来自迁移指南):

它以前在默认位置列表中添加了一个位置,现在它替换了默认位置。如果您依赖于以前的处理方式,那么现在应该使用spring.config。其他位置。

因此,根据您的用例,您应该考虑将哪些属性设置为环境变量。新的应该类似于< code>setenv.sh中的< code > spring _ config _ additional-location 。参考文档中也描述了从哪里查找文件。

匿名用户

我不得不这样做几次,我发现的最好的方法是将外部目录配置为容器中的类路径资源:

然后,在目录中放置您要外部化的资源,一切都会正常运行。要在Spring加载资源,您可以这样做:

<beans:bean id="externalProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <beans:property name="location" value="classpath:[my-application-name]/applicationProperties.properties" />
            <beans:property name="placeholderPrefix" value="!applicationProperties{" />
            <beans:property name="placeholderSuffix" value="}" />
        </beans:bean>

您可以看到,正如您所说的,您可能希望在每个tomcat中部署多个应用程序,您可以在classpath中设置的文件夹中创建一个目录结构,以维护不同的应用程序。每个war应用程序的属性

如果您想在Spring配置中动态地维护应用程序名称部分,可以通过几种方式来实现,在maven中的打包阶段,甚至可以使用应用程序上下文路径