小编典典

Spring Boot属性文件的外部配置

spring-boot

我有一个Spring Boot应用程序,可以打包在要部署到不同环境的战争中使用。要自动执行此部署,将配置文件外部化会更容易。

当前,一切都可以与src / main / resources中的application.properties文件一起正常工作。然后,我使用“ mvn
install”构建可部署到tomcat的war。但是我想使用一个.yml文件,该文件不需要在mvn安装中出现,但可以在战争部署期间从其中读取,并且相对于我的战争位于同一目录中。

24.外部化配置显示了Spring
Boot将在哪里寻找文件和72.3更改应用程序外部属性的位置,提供了有关如何配置此配置的更多详细信息,但我只是不了解如何将其转换为我的代码。

我的应用程序类如下:package be.ugent.lca;

Updated below

我需要在该文件中添加@PropertySource吗?我将如何指代某个相对路径?

我觉得它可能像大多数spring boot文档一样被记录在其中,但是我只是不明白它们对我的意义。

编辑

不知道这是否应该是一个单独的问题,但我认为它仍然是相关的。
设置os变量后,找不到yaml文件的错误消失了。但是,与没有应用程序.properties或.yml文件时,我仍然再次遇到相同的错误。现在,应用程序如下所示:

@Configuration
**@PropertySource("file:${application_home}/application.yml")**
@ComponentScan({"be.ugent.lca","be.ugent.sherpa.configuration"})
@EnableAutoConfiguration
@EnableSpringDataWebSupport
public class Application extends SpringBootServletInitializer{
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);

    }

application_home OS变量

$ echo $application_home  
C:\Masterproef\clones\la15-lca-web\rest-service\target

我的application.yml文件(抱怨的部分):

sherpa:
  package:
    base: be.ugent.lca

java -jar * .war时发生错误所有以下变化:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'sherpa.package.base' in string value "${sherpa.package.base}"
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
    at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:204)
    at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:178)
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172)
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:808)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1027)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)
    ... 142 more

阅读 431

收藏
2020-05-30

共1个答案

小编典典

使用外部属性文件

答案就在Spring Boot Docs中,我将尽力为您分解。

首先,不@PropertySource,在使用Yaml配置时,如在Yaml缺点下所述,您不应该使用:

无法通过@PropertySource批注加载YAML文件。因此,如果您需要以这种方式加载值,则需要使用属性文件。

那么,如何加载属性文件?此处说明了应用程序属性文件

已为您加载了一个:application.yml,将其放在上面链接中提到的目录之一中。这对您的常规配置非常有用。

现在,对于您的特定于环境的配置(以及诸如密码之类的东西),您想使用外部属性文件,该部分中还将说明如何执行此操作:

如果您不喜欢application.properties作为配置文件名,则可以通过指定spring.config.name环境属性来切换到另一个。您还可以使用spring.config.location环境属性(目录位置或文件路径的逗号分隔列表)引用显式位置。

因此,您可以使用spring.config.location环境属性。假设您有一个外部配置文件:application- external.yml在主目录下的conf /目录中,只需像这样添加它:
-Dspring.config.location=file:${home}/conf/application- external.yml作为JVM的启动参数。如果您有多个文件,只需用逗号将它们分开。请注意,您可以轻松使用此类外部属性来覆盖属性,而不仅仅是添加它们。

我建议通过使您的应用程序仅与内部application.yml文件一起使用来进行测试,然后覆盖外部属性文件中的(测试)属性并将其值记录在某处。

将Yaml属性绑定到对象

使用Yaml属性时,通常会使用加载它们@ConfigurationProperties,这在使用列表或更复杂的属性结构时非常有用
。(这就是为什么您应该使用Yaml属性的原因,对于简单的属性,最好使用常规属性文件)。阅读此以获得更多信息:类型安全配置属性

附加:在IntelliJ,Maven和JUnit测试中加载这些属性

有时您想在Maven构建中或执行测试时加载这些属性。或者仅用于使用IDE进行本地开发

如果您使用 IntelliJ 进行开发,则可以通过将其添加到Tomcat运行配置中轻松添加它:“运行”->“编辑配置”,在“
Tomcat服务器”下选择您的运行配置,选中“服务器”选项卡并将其添加到“ VM”下选项”。

要在 Maven构建中 使用外部配置文件,请执行以下操作:在pom.xml中配置如下的maven surefire插件:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
     <argLine>-Dspring.config.location=file:${home}/conf/application-external.yml
   </configuration>
</plugin>

在IntelliJ中运行 JUnit测试 时:

  • 运行→编辑配置
  • 默认值→JUnit
  • 添加虚拟机选项-> -ea -Dspring.config.location=file:${home}/conf/application-external.yml
2020-05-30