如何将Spring Boot中的application.properties文件外部化到例如外部依赖JAR?

时间:2018-01-13 18:14:15

标签: java spring spring-boot

我有一个简单的Maven模块(不是Spring Boot应用程序),我在其中放置了application.properties文件。

我有6-7个Spring Boot应用程序,我不想在每个应用程序目录中都有一个application.properties文件。我更喜欢它,如果它在一个地方(外部Maven模块)。

我在每个Spring Boot应用程序poms中添加了maven模块作为依赖项。

但是,当我运行这些应用程序时,它无法自动检测application.properties文件,因为它来自物理上不存在于每个应用程序目录中的依赖jar。

有没有办法让这成为可能?我想避免在6-7个不同的位置使用属性文件,因为这很难管理和处理。

提前谢谢!

2 个答案:

答案 0 :(得分:5)

考虑使用Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持。它需要一些小的努力,但从长远来看它非常有用。配置服务器管理配置文件(.properties.yml),您仍然可以为每个配置文件使用不同的配置(例如application-test.propertiesapplication-prod.properties等)。您的应用程序具有更高的优先级,因此如果需要,您始终可以覆盖来自配置服务器的属性。另一个很酷的功能是配置服务器可以使用Git存储库,因此您可以轻松地对所有配置文件进行版本控制。它还支持加密 - 任何脆弱的数据都可以加密,因此只有您的应用程序知道如何解密它。

配置服务器

配置服务器只不过是一个简单的Spring Boot应用程序,它可以实现为:

@SpringBootApplication
@EnableConfigServer
public class ConfigServer {
  public static void main(String[] args) {
    SpringApplication.run(ConfigServer.class, args);
  }
}

包含简单的 application.properties 文件:

server.port: 8888
spring.cloud.config.server.git.uri: file://${user.home}/config-repo

依赖于 pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

配置客户端

在客户端,您可以为 pom.xml (或 build.gradle 中的等效项添加依赖项,如果您使用Gradle):

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
</dependency>

您需要做的就是将配置服务器的URL添加到 application.properties (如果您使用YAML insted,则添加 application.yml ):

spring.cloud.config.uri: http://myconfigserver.com

配置文件结构

现在让我们假设您已经为配置文件设置了Git存储库。我们假设您的应用程序的名称类似于horusvenusmercury等,并且您有3个不同的配置文件:devtestprod。您还有一些适用于所有应用程序的配置。在这种情况下,您的配置文件结构将如下所示(我将在此处使用属性文件,但它也适用于YAML):

  • application.properties - 所有应用的常用配置,无论他们使用什么配置文件
  • application-dev.properties - 使用dev个人资料
  • 运行的所有应用的通用配置
  • application-test.properties - 使用test个人资料
  • 运行的所有应用的通用配置
  • application-prod.properties - 使用prod个人资料
  • 运行的所有应用的通用配置
  • horus.properties - horus app config for,common for all profiles
  • horus-dev.properties - 仅dev个人资料的horus应用配置
  • horus-test.properties - 仅test个人资料的horus应用配置
  • horus-prod.properties - 仅prod个人资料的horus应用配置

可以设置一些其他选项(如加密,连接策略(快速失败或忽略)等),一切都在官方文档中有详细描述和记录https://cloud.spring.io/spring-cloud-config/希望它可以帮助您做出一个好的选择用于在分布式应用程序环境中管理配置。配置服务器是为解决这个问题而发明的解决方案。

答案 1 :(得分:3)

虽然Szymon Stepniak的答案肯定是一本书,但是#34; Spring Boot答案,我了解你的情况,甚至尝试做你自己尝试做的事情。实际上,您无法在其他&#34;外部模块中定义application.properties&#34;。

以下是我如何解决它:

  1. 在&#34; common&#34;中创建配置模块
  2. src/main/resources中创建属性文件。它不应该被命名为应用程序属性,最好为它提供一个唯一的名称(至少这是我完成它的方式,所以让我们假设该文件被调用application-common.properties

  3. 使用@PropertySources注释定义属性文件并使用配置加载它。

  4. 以下是一个例子:

    package com.myapp.common;
    @Configuration
    @PropertySources({
        @PropertySource("classpath:application-common.properties")
    })
    public class MyConfiguration {
        // you don't really have to define beans 
    }
    

    现在,如果您希望仅在构建系统的spring boot模块中定义依赖项时自动加载此配置,我发现最好使用spring工厂:

    1. 创建文件src/main/resources/META-INF/spring.factories
    2. 将以下内容放入此文件中:

      org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      com.myapp.common.MyConfiguration