Spring引导属性文件的外部配置

tur*_*oni 14 java spring-boot

我有一个spring boot应用程序,我可以将其打包在一个我要部署到不同环境的战争中.要自动执行此部署,可以更轻松地将配置文件外部化.

目前,src/main/resources中的application.properties文件一切正常.然后我使用'mvn install'来构建可部署到tomcat的war.但是我想使用一个不需要出现在mvn install上的.yml文件,但是在战争部署期间可以读取该文件,并且它与我的战争相同或相同.

24.外部化配置显示spring boot将查找文件的位置72.3更改应用程序外部属性的位置提供了有关如何配置此内容的更多详细信息,但我只是不明白如何将其转换为我的代码.

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

Updated below
Run Code Online (Sandbox Code Playgroud)

我需要在此文件中添加@PropertySource吗?我如何参考某个相对路径?

我觉得它可能记录在那里作为大多数春季启动文档,但我只是不明白他们是如何做到这一点.

编辑

不确定这是否应该是一个单独的问题,但我认为它仍然相关.
设置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);

    }
Run Code Online (Sandbox Code Playgroud)

application_home OS变量

$ echo $application_home  
C:\Masterproef\clones\la15-lca-web\rest-service\target
Run Code Online (Sandbox Code Playgroud)

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

sherpa:
  package:
    base: be.ugent.lca
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

loï*_*oïc 28

使用外部属性文件

答案在于Spring Boot Docs,我会尝试为你分解它.

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

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

那么,如何加载propery文件?这是在应用程序属性文件中解释的

一个为您加载:application.yml,将其放在上面链接中提到的其中一个目录中.这非常适合您的常规配置.

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

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

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

我建议通过让你的应用程序只使用你的内部application.yml文件来测试它,然后在你的外部属性文件中覆盖(test)属性并在某处记录它的值.

将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>    
Run Code Online (Sandbox Code Playgroud)

在IntelliJ中运行JUnit测试时:

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


dev*_*per 5

是的,您需要使用@PropertySource如下所示.

这里重要的一点是,您需要提供application_home属性(或选择任何其他名称)作为OS环境变量或系统属性,或者您可以在启动Spring引导时作为命令行参数传递.此属性告诉配置文件(.properties.yaml)的位置(示例:/usr/local/my_project/etc ..)

@Configuration
@PropertySource("file:${application_home}config.properties")//or specify yaml file
@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);
    }
}
Run Code Online (Sandbox Code Playgroud)