在Tomcat上使用外部配置进行Spring启动

nix*_*get 3 configuration war tomcat8 spring-boot

我无法在stackoverflow上找到这个问题的答案因此我在这里问我所以我可以得到一些想法.

我有一个Spring Boot应用程序,我已经在Tomcat 8上部署为war包.我按照本指南创建一个可部署的war文件,它似乎工作得很好.

但是我目前遇到的问题是能够外部化配置,因此我可以将配置作为木偶模板进行管理.

在项目中我所拥有的是,

src/main/resources
                  -- config/application.yml
                  -- config/application.dev.yml
                  -- config/application.prod.yml
                  -- logback-spring.yml
Run Code Online (Sandbox Code Playgroud)

那我怎么可能加载config/application.dev.ymlconfig/application.prod.yml外部仍然保持config/application.yml?(包含默认属性spring.application.name)

我已经读过配置按此顺序加载,

  1. 当前目录的A/config子目录.
  2. 当前目录
  3. 一个classpath/config包
  4. 类路径根

因此我试图加载配置文件/opt/apache-tomcat/lib无济于事.

到目前为止有效

通过加载 export CATALINA_OPTS="-Dspring.config.location=/opt/apache-tomcat/lib/application.dev.yml"

不过我想知道的是,

  1. 找出为什么通过/opt/apache-tomcat/libclasspath 加载不起作用.
  2. 有没有更好的方法来实现这一目标?

小智 5

你对加载顺序是正确的.根据Spring启动文档

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

  • 当前目录的A/config子目录.
  • 当前目录
  • 一个classpath/config包
  • 类路径根

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

[注意]
您也可以使用YAML('.yml')文件替代'.properties'.

这意味着,如果您将application.yml文件放入/opt/apache-tomcat/lib/opt/apache-tomcat/lib/config将加载它.

  1. 找出为什么通过/ opt/apache-tomcat/lib classpath加载不起作用.

但是,如果放置application.dev.yml到该路径,则不会加载它,因为application.dev.ymlSpring不是文件名.如果您希望Spring也读取该文件,您需要将其作为选项
--spring.config.name=application.dev-Dspring.config.name=application.dev.
但我不建议这种方法.

  1. 有没有更好的方法来实现这一目标?

是.使用特定于Spring配置文件的属性.您可以将文件重命名application.dev.ymlapplication-dev.yml,并提供-Dspring.profiles.active=dev选项.Spring将同时读取application-dev.ymlapplication.yml文件和配置文件的具体配置将覆盖默认配置.

我建议增加-Dspring.profiles.active=dev(或prod)CATALINA_OPTS每个对应的服务器/ Tomcat实例.