【问题标题】:How to add multiple application.properties files in spring-boot?如何在spring-boot中添加多个application.properties文件?
【发布时间】:2023-03-22 00:15:02
【问题描述】:

我有一个 Spring Boot 应用程序,它分为几个模块。 主模块运行应用程序并在资源文件夹中有一个application.properties 文件。我想知道是否可以在子模块中添加另一个属性文件来分隔属于该模块的属性以及如何使其工作(因为它不是)。

+main_module
  +src
    +main
      +java
        +my/package/Application.java
        +resources/application.properties
+support_module
  +src
    +main
      +java
        +resources/application.properties

所以,这就是目前的情况。显然,模块support_module 中的属性文件未被读取导致NoSuchBeanDefinitionException,而如果我将内容放在其他属性文件中,一切正常。

【问题讨论】:

标签: java spring spring-boot


【解决方案1】:

Spring Boot 按以下顺序读取属性文件。 (From Spring Boot in Action)

  1. 在外部,在运行应用程序的目录的 /config 子目录中
  2. 在外部,在运行应用程序的目录中
  3. 在内部,在名为“config”的包中
  4. 在内部,在类路径的根目录

列表按优先级排序(在列表中较高位置定义的属性会覆盖在较低位置定义的属性)。

因此,将application.properties 放在config 子目录中会赋予它更高的优先级。在以下配置中,来自module_aapplication.properties 将优先。您可以在application.properties 中添加常用默认值,并通过将配置文件放在config/application.properties 中来覆盖各个模块中的默认值。

+common_module
  +src
    +main
      +java
      +resources/application.properties
+module_a
  +src
    +main
      +java
        +my/package/Application.java
      +resources/config/application.properties

【讨论】:

  • 当它在前一个位置找到一个属性文件,但在该文件中没有找到该属性的值时,它会在下一个位置搜索属性值吗?
【解决方案2】:

问题正是@geoand 所描述的。 Spring Boot 加载顶级 application.properties 并忽略位于其他 jar 中的具有确切名称的任何属性文件。

但是我没有找到任何关于如何解决这个问题的具体实现,所以这里是为那些想知道实现的人准备的。

考虑这个项目配置:

+main_module
  +src
    +main
      +java
        +my/package/Application.java
      +resources/application.properties
+module_aa
  +src
    +main
      +java
        +my/package/config/ModuleAAConfig.java
      +resources/module_aa.properties
+module_bb
  +src
    +main
      +java
        +my/package/config/ModuleBBConfig.java
      +resources/module_bb.properties

现在要正确加载每个子模块的属性,我们需要在每个模块的配置上添加@PropertySource 注释,即ModuleAAConfig.java, ModuleBBConfig.java

例子:

ModuleAAConfig.java

package my.package.config;

@Configuration
@PropertySource(
    ignoreResourceNotFound = false,
    value = "classpath:module_aa.properties")
public class ModuleAAConfig {}

ModuleBBConfig.java

package my.package.config;

@Configuration
@PropertySource(
    ignoreResourceNotFound = false,
    value = "classpath:module_bb.properties")
public class ModuleBBConfig {}

奖励:

如果你想加载配置文件特定的属性,你可以通过使用 spring 变量来做到这一点,例如

@PropertySource("classpath:module_aa-${spring.profiles.active}.properties")

【讨论】:

    【解决方案3】:

    您还可以使用 spring.config.location 环境属性(以逗号分隔的目录位置或文件路径列表)引用显式位置

    $ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
    

    更多信息click这里

    【讨论】:

      【解决方案4】:

      在使用 Maven 或 Gradle 时,您尝试执行的操作将不起作用。原因是在创建工件时(很可能是因为您使用的是 Spring Boot 的 jar),根目录中只会有一个 application.properties 文件。

      我建议您更改支持模块上的属性文件的名称,然后配置 Spring Boot 以查找该文件(查看 thisthis 指针的答案),或使用一些您的构建工具的一种合并任务(可能类似于this

      【讨论】:

      • 第一个建议看起来很有趣。如何指示 Spring Boot 在二级模块中查找属性?
      • @mat_boy 你还应该看到this SO 线程
      • 啊啊啊!所以我只需要在主要的application.properties 中使用spring.config.location。酷
      • 我选择了this的注解,谢谢!
      • Here 是另一个关于如何将 java 命令设置为指向多个属性文件的演练
      猜你喜欢
      • 2017-01-26
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 2019-02-11
      • 2019-01-19
      • 2016-03-04
      相关资源
      最近更新 更多