我有一个spring boot应用程序,我可以打包在一个我要部署到不同环境的战争中。要自动执行此部署,可以更轻松地将配置文件外部化。
目前,src / main / resources中的application.properties文件一切正常。然后我使用'mvn install'来构建可部署到tomcat的war。 但是我想使用一个不需要出现在mvn install上的.yml文件,但是在部署战争期间可以读取该文件,并且与我的战争相同或者相同。
24. externalized configuration显示了spring boot将查找文件的位置,72.3 Change the location of external properties of an application提供了有关如何配置此文件的更多详细信息,但我只是不明白如何将其转换为我的代码。
我的应用程序类如下所示: 包be.ugent.lca;
Updated below
我是否需要在此文件中添加@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);
}
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
答案 0 :(得分:27)
使用外部属性文件
答案在于Spring Boot Docs,我会尝试为你分解它。
首先,在使用Yaml配置时,不应该使用@PropertySource
,如Yaml shortcomings下所述:
无法通过@PropertySource注释加载YAML文件。因此,如果您需要以这种方式加载值,则需要使用属性文件。
那么,如何加载propery文件?这在Application Property Files
中解释为您加载一个:application.yml
,将其放在上面链接中提到的其中一个目录中。这非常适合您的常规配置。
现在,对于您的环境特定配置(以及密码之类的东西),您想要使用外部属性文件,该部分还解释了如何执行此操作:
如果您不喜欢application.properties作为配置文件名,可以通过指定spring.config.name环境属性来切换到另一个。您还可以使用spring.config.location环境属性(以逗号分隔的目录位置列表或文件路径)来引用显式位置。
因此,您使用spring.config.location
环境属性。
想象一下,你的主目录下的conf / dir中有一个外部配置文件:application-external.yml
,只需添加如下:
-Dspring.config.location=file:${home}/conf/application-external.yml
作为JVM的启动参数。
如果您有多个文件,只需用逗号分隔即可。请注意,您可以轻松使用此类外部属性来覆盖属性,而不仅仅是添加它们。
我建议通过让您的应用程序只使用内部application.yml文件来测试它,然后覆盖外部属性文件中的(test)属性并在某处记录它的值。
将Yaml属性绑定到对象
使用Yaml属性时,我通常使用@ConfigurationProperties
加载它们,这在处理示例列表或更复杂的属性结构时非常有用。 (这就是为什么你应该使用Yaml属性,对于简单的属性,你可能更好地使用常规属性文件)。阅读本文以获取更多信息:Type-Safe Configuration properties
额外:在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
答案 1 :(得分:5)
是的,您需要使用@PropertySource
,如下所示。
这里重点是您需要提供application_home
属性(或选择任何其他名称)作为OS环境变量或系统属性,或者您可以作为命令行参数传递在启动Spring启动时。此属性指示配置文件(.properties
或.yaml
)的确切位置(例如:/usr/local/my_project/
等。)
@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);
}
}
答案 2 :(得分:0)
使用系统环境变量使用外部属性文件的最简单方法之一是,在application.properties文件中,您可以使用以下语法:
spring.datasource.url = ${OPENSHIFT_MYSQL_DB_HOST}:${OPENSHIFT_MYSQL_DB_PORT}/"nameofDB"
spring.datasource.username = ${OPENSHIFT_MYSQL_DB_USERNAME}
spring.datasource.password = ${OPENSHIFT_MYSQL_DB_PORT}
现在,声明上面使用的环境变量,
export OPENSHIFT_MYSQL_DB_HOST="jdbc:mysql://localhost"
export OPENSHIFT_MYSQL_DB_PORT="3306"
export OPENSHIFT_MYSQL_DB_USERNAME="root"
export OPENSHIFT_MYSQL_DB_PASSWORD="123asd"
这样,您可以在不同的环境中对同一变量使用不同的值。
答案 3 :(得分:-4)
在引导类中使用以下代码:
@PropertySource({"classpath:omnicell-health.properties"})
使用控制器中的以下代码:
@Autowired
private Environment env;