如何在Tomcat Webserver中外部化applicatage.properties for Spring?

2022-09-01 22:44:28

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 容器外部添加其他位置,例如 ?wartomcatapplication.propertiesd:\application.properties

自定义位置应获得有关上述位置的最高优先级。

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

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


答案 1

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

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

答案 2

可以设置指向包含 application.properties 文件的文件夹的环境变量。spring_config_location

对于Tomcat,您可以通过将以下行添加到文件中来执行此操作(如果缺少,请创建文件):<TOMCAT_HOME>/bin/setenv.sh

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);
    }
}

这将在使用 BOOT 运行时选择新名称。要在部署在 Tomcat 上时也配置名称,请覆盖如下配置:SpringBootServletInitializer

public class ServletInitializer extends SpringBootServletInitializer {

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

}

然后将属性文件命名为:.而不是默认名称Spring将寻找它。在我们的示例中,你可以将所有应用属性文件放在指定的文件夹中。您的外部属性将获得优先权。有关优先级,请参阅此处:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.htmlmy-app.properties/usr/local/tomcat/conf/

更新

Spring Boot 2 以来,的行为已更改(来自迁移指南):spring_config_location

它以前将一个位置添加到默认位置列表中,现在它替换了默认位置。如果您依赖于之前的处理方式,则现在应该改用spring.config.additional-location。

因此,根据您的用例,您应该考虑将哪些属性设置为环境变量。新的应该看起来像在 中。从何处查找文件也在参考文档中进行了描述。spring_config_additional-locationsetenv.sh


推荐