繁体   English   中英

属性文件的spring boot外部配置

[英]Spring boot external configuration of property file

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

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

24. externalized configuration显示 spring boot 将在哪里查找文件, 72.3 Change the location of external properties of an application提供了有关如何配置的更多详细信息,但我只是不明白如何将其转换为我的代码。

我的应用程序类如下所示: 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 操作系统变量

$ 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 中,我将尝试为您分解它。

首先,不,你不应该在使用 Yaml 配置时使用@PropertySource ,正如在Yaml 缺点下提到的:

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

那么,如何加载属性文件呢? 此处解释了应用程序属性文件

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

现在,对于您想要使用外部属性文件的环境特定配置(以及密码等内容),该部分还解释了如何执行此操作:

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

所以你使用spring.config.location环境属性。 假设你有一个外部配置文件:在你的主目录下的 conf/ 目录下的application-external.yml ,只需像这样添加它: -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</argLine>
   </configuration>
</plugin>    

在 IntelliJ 中运行JUnit 测试时:

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

是的,您需要使用@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);
    }
}

有一种非常简单的方法可以实现这一点。

在原始 application.properties 文件中,您只需指定以下行:

spring.config.import=file:Directory_To_The_File/Property_Name.properties

它将自动同步外部属性文件中的所有属性。

现在假设您需要从多个属性文件中获取属性。 在这种情况下,您可以在外部属性文件中提及同一行,这反过来将从第二个属性文件中获取剩余的属性,依此类推。

考虑以下示例。

应用程序属性:

spring.config.import=文件:资源/Custom1.properties

Custom1.properties:

server.port=8090
.
.
.
spring.config.import=file:Resources/Custom2.properties

使用系统环境变量使用外部化属性文件的最简单方法之一是,在 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" 

这样,您可以在不同的环境中为相同的变量使用不同的值。

在引导类中使用以下代码:

@PropertySource({"classpath:omnicell-health.properties"})

在您的控制器中使用以下代码:

@Autowired
    private Environment env;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM