我有一个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
无法通过@PropertySource批注加载YAML文件。因此,如果您需要以这种方式加载值,则需要使用属性文件。
那么,如何加载属性文件?此处说明了应用程序属性文件
已为您加载了一个:application.yml,将其放在上面链接中提到的目录之一中。这对您的常规配置非常有用。
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的启动参数。如果您有多个文件,只需用逗号将它们分开。请注意,您可以轻松使用此类外部属性来覆盖属性,而不仅仅是添加它们。
spring.config.location
application- external.yml
-Dspring.config.location=file:${home}/conf/application- external.yml
我建议通过使您的应用程序仅与内部application.yml文件一起使用来进行测试,然后覆盖外部属性文件中的(测试)属性并将其值记录在某处。
将Yaml属性绑定到对象
使用Yaml属性时,通常会使用加载它们@ConfigurationProperties,这在使用列表或更复杂的属性结构时非常有用 。(这就是为什么您应该使用Yaml属性的原因,对于简单的属性,最好使用常规属性文件)。阅读此以获得更多信息:类型安全配置属性
@ConfigurationProperties
附加:在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测试 时:
-ea -Dspring.config.location=file:${home}/conf/application-external.yml