首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将Spring中的application.properties文件外部化为例如外部依赖的JAR?

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

Stack Overflow用户
提问于 2018-01-13 18:14:15
回答 2查看 4.8K关注 0票数 4

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

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

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

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

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

提前谢谢你!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-13 20:24:09

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

配置服务器

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

代码语言:javascript
运行
复制
@SpringBootApplication
@EnableConfigServer
public class ConfigServer {
  public static void main(String[] args) {
    SpringApplication.run(ConfigServer.class, args);
  }
}

使用简单的application.properties文件包括:

代码语言:javascript
运行
复制
server.port: 8888
spring.cloud.config.server.git.uri: file://${user.home}/config-repo

在pom.xml中使用依赖项

代码语言:javascript
运行
复制
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

配置客户端

在客户端,您可以向pom.xml添加一个依赖项(如果使用Gradle,则在build.gradle中添加它的对应项):

代码语言:javascript
运行
复制
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
</dependency>

您所要做的就是向您的application.properties (如果您使用YAML insted)中添加一个配置服务器的URL (或者application.yml ):

代码语言:javascript
运行
复制
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配置,适用于所有配置文件
  • horus-dev.properties -仅用于dev配置文件的horus配置
  • horus-test.properties -仅用于test配置文件的horus配置
  • horus-prod.properties -仅用于prod配置文件的horus配置
  • 等。

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

票数 5
EN

Stack Overflow用户

发布于 2018-01-13 23:11:38

Szymon Stepniak的回答当然是Spring Boot答案的“按部就班”,但我理解你的处境,甚至试图自己去做你想做的事情。实际上,您不能在其他“外部模块”中定义application.properties。

我就是这样解决这个问题的:

  1. 在“公共”模块中创建配置
  2. src/main/resources中创建一个属性文件。它不应该被命名为应用程序属性,最好为它提供一个唯一的名称(至少我是这样做的,所以让我们假设文件名为application-common.properties)
  3. 使用@PropertySources注释来定义属性文件并用配置加载它。

下面是一个示例:

代码语言:javascript
运行
复制
package com.myapp.common;
@Configuration
@PropertySources({
    @PropertySource("classpath:application-common.properties")
})
public class MyConfiguration {
    // you don't really have to define beans 
}

现在,如果您希望只因为在构建系统的spring引导模块中定义了依赖项而自动加载此配置,那么我已经找到了最佳利用spring工厂的方法:

  1. 创建文件src/main/resources/META-INF/spring.factories
  2. 将以下内容放入此文件: org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.myapp.common.MyConfiguration
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48242873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档