繁体   English   中英

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

[英]How to externalize application.properties files in Spring Boot to e.g. external dependent JAR?

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

我有6-7春天启动的应用程序,我不希望有一个application.properties中的每个文件和每一个应用程序目录。 我更喜欢它,如果它在一个地方(外部Maven模块)。

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

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

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

先感谢您!

考虑使用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添加依赖项(如果使用Gradle,则在build.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.properties通用配置,无论他们使用什么配置文件
  • application-dev.properties - 使用dev配置文件运行的所有应用application-dev.properties通用配置
  • application-test.properties - 使用test配置文件运行的所有应用application-test.properties通用配置
  • application-prod.properties - 使用prod配置文件运行的所有应用application-prod.properties通用配置
  • horus.properties - horus app config for,适用于所有配置文件
  • horus-dev.properties - 仅用于dev配置文件的horus app配置
  • horus-test.properties - 仅用于test配置文件的horus app配置
  • horus-prod.properties - 仅用于prod配置文件的horus app配置
  • 等等

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

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

以下是我如何解决它:

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

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

这是一个例子:

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 

暂无
暂无

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

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