在 Maven 子模块中使用 Spring @PropertySource

Using Spring @PropertySource in a Maven submodule

在 Spring-boot 应用程序中,我只有一个模块,并且能够注入配置文件,例如"my.properties",位于 src/main/resources 中,如下所示:

@Configuration
@PropertySource("/my.properties")
public class MyConf{
}

一切正常,但后来我创建了子模块,现在我将该配置文件移动到子模块中。当我启动主应用程序时,出现以下异常:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.myapp.MainApplication]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/home/jeanvaljean/workspace/mainmodule/secondarymodule/my.properties]

如我所见,我可以通过写

来解决问题
@PropertySource("/src/main/resources/my.properties")

这样做,路径正确,可以加载文件。

无论如何,这是一个糟糕的解决方案,我很确定还有一个更优雅、更灵活的替代方案。有什么解决办法吗?

Spring 有几种不同的资源查找方式。通过使用前缀 classpath:,您告诉 Spring 在所有 class 路径中搜索资源,而不是在与您的应用程序捆绑在一起的 classes 中。

根据 ApplicationContenxt,Spring 将使用不同的默认资源 class。在您的情况下,Spring 似乎正在实例化一个 FileSystemResource,它只查找文件系统上具有相对或绝对路径(但不在 jars 内!)的可用文件。我的经验法则是永远不要在相同的 module/component/jar 中添加前缀,如果我知道它在不同的 module/component/jar 中,则始终添加 classpath: 前缀(有些人对此很生气: ).

您可以在 Spring Documentation - Resources

中阅读更多内容