Spring Boot属性文件的外部配置

我有一个Spring Boot" title="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

回答:

答案就在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属性时,通常会使用加载它们@ConfigurationProperties,这在使用列表或更复杂的属性结构时非常有用

。(这就是为什么您应该使用Yaml属性的原因,对于简单的属性,最好使用常规属性文件)。阅读此以获得更多信息:类型安全配置属性

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

如果您使用 进行开发,则可以通过将其添加到Tomcat运行配置中轻松添加它:“运行”->“编辑配置”,在“

Tomcat服务器”下选择您的运行配置,选中“服务器”选项卡并将其添加到“ VM”下选项”。

要在 使用外部配置文件,请执行以下操作:在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
  • 添加虚拟机选项-> -ea -Dspring.config.location=file:${home}/conf/application-external.yml

以上是 Spring Boot属性文件的外部配置 的全部内容, 来源链接: utcz.com/qa/408749.html

回到顶部