我有一个Sping Boot 应用程序,它被分成几个模块。主模块运行应用程序,在resources文件夹中有一个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
,而如果我把内容放在另一个属性文件中,一切都很好。
6条答案
按热度按时间u1ehiz5o1#
您尝试执行的操作在使用Maven或Gradle时无法执行,原因是创建工件(由于您使用的是Sping Boot ,因此很可能是jar)时,根目录中只有一个
application.properties
文件。我建议您更改支持模块上的属性文件的名称,然后配置Sping Boot 来查找该文件(查看this或this指针答案),或者为您的构建工具使用某种类型的合并任务(可能类似于this)
t30tvxxf2#
这个问题正是@geoand所描述的。Spring boot加载顶级
application.properties
,并忽略其他jar中任何同名的属性文件。但我没有找到任何具体的实现如何解决这个问题,所以这里是为那些谁想要知道的实现。
请考虑以下项目配置:
现在,为了正确加载每个子模块的属性,我们需要在每个模块的配置上添加
@PropertySource
注解,即ModuleAAConfig.java, ModuleBBConfig.java
。示例:
ModuleAAConfig.java
ModuleBBConfig.java
如果您想加载配置文件特定的属性,您可以通过使用Spring变量来完成,例如:
efzxgjgh3#
Sping Boot 按照以下顺序读取属性文件。(摘自Spring Boot in Action)
1.在外部,位于运行应用程序的目录的/config子目录中
1.在外部,位于运行应用程序的目录中
1.在内部,位于名为“config”的包中
1.在内部,位于类路径的根目录
该列表按优先级排序(在列表中较高位置定义的特性将覆盖在较低位置定义的特性)。
因此,将
application.properties
放在config
子目录中将给予它更高的优先级。在以下配置中,来自module_a
的application.properties
将优先。您可以在application.properties
中添加公共默认值,并通过将配置文件放在config/application.properties
中在单个模块中覆盖它们。xiozqbni4#
您还可以使用spring.config.location环境属性(逗号分隔的目录位置或文件路径列表)引用显式位置
有关click的更多信息,请单击此处
mw3dktmi5#
作为一个选项,您可以更正确地设计您的模块,并实现
EnvironmentPostProcessor
来自动加载它们的个人属性文件。请看我的详细回答:如何application.properties在Spring中继承www.example.com?
5jdjgkvh6#
在同一工件中不可能有多个
application.properties
,但可以有在相同的工件中。这可能有助于分离关注点。