如何在spring-boot中添加多个application.properties文件?

mat*_*boy 29 java spring spring-boot

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

+main_module
  +src
    +main
      +java
        +my/package/Application.java
        +resources/application.properties
+support_module
  +src
    +main
      +java
        +resources/application.properties
Run Code Online (Sandbox Code Playgroud)

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

geo*_*and 21

使用Maven或Gradle时,您尝试执行的操作无效.原因是当创建工件(自从您使用Spring Boot以来很可能是jar)application.properties时,根目录中只会有一个文件.

我建议您更改支持模块上的属性文件的名称,然后配置Spring Boot以查找该文件(查看指针或指针的答案),或者为构建使用某种合并任务工具(像这样也许)

  • 第一个建议看起来很有趣。如何指示 Spring Boot 查找辅助模块中的属性? (2认同)

Imt*_*que 7

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

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

考虑这个项目配置:

+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
Run Code Online (Sandbox Code Playgroud)

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

例子:

ModuleAAConfig.java

+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
Run Code Online (Sandbox Code Playgroud)

ModuleBBConfig.java

package my.package.config;

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

奖金:

如果你想加载配置文件特定的属性,你可以通过使用 spring 变量来实现,例如

package my.package.config;

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


zer*_*one 6

Spring Boot 按以下顺序读取属性文件。(来自 Spring Boot 实战

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

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

因此,放置application.propertiesconfig子目录中将赋予它更高的优先级。在以下配置中,application.propertiesfrommodule_a将优先。您可以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
Run Code Online (Sandbox Code Playgroud)


srs*_*jid 5

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

$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请单击此处