Spring资源加载

Dav*_*vid 5 spring spring-boot

任何人都可以解释当一个人使用ResourceLoader.getResource(...)方法时,Spring如何决定在哪里寻找资源?

我遇到了使用Spring Boot构建的多模块maven应用程序的问题,在我的集成测试中,我的代码能够使用resourceLoader.getResource("templates/")甚至找到资源resourceLoader.getResource("classpath:templates/").到现在为止还挺好...

但是,当模块最终打包到可执行JAR中并使用嵌入式Tomcat运行时,无法再解析资源.我也尝试resourceLoader.getResource("classpath*:templates/")过没有成功.

我发现的问题是,当我添加一个日志语句来输出搜索中使用的URL时,我会得到一个项目中其他模块之一的路径(而不是实际包含相关资源的模块).例如:jar:file:/Users/david/exmaple/target/spring-boot-0.0.1-SNAPSHOT.jar!/lib/module1-0.0.1-SNAPSHOT.jar!/templates/我相信资源在jar:file:/Users/david/exmaple/target/spring-boot-0.0.1-SNAPSHOT.jar!/lib/module2-0.0.1-SNAPSHOT.jar!/templates/

资源加载器是从Autowired构造函数param获得的.

提前感谢任何提示.

编辑

如果不清楚或不重要,我对相关模块的集成测试不了解其他模块.我有module1,module2和spring-boot模块,它依赖于module1和module2.本质上,当我运行模块2的集成测试时,类路径不知道module1 - 所以我怀疑这与它在测试中的工作原理有关.

小智 2

当您使用classpath:或classpath*:前缀时,这实际上是通过 Spring 中的 ClassLoader.getResources(\xe2\x80\xa6\xe2\x80\x8b) 调用发生的。

\n\n
\n

通配符类路径依赖于底层类加载器的 getResources() 方法。由于现在大多数应用程序服务器都提供自己的类加载器实现,因此行为可能会有所不同,尤其是在处理 jar 文件时。检查 classpath* 是否有效的一个简单测试是使用类加载器从类路径上的 jar 中加载文件:getClass().getClassLoader().getResources("<someFileInsideTheJar>")。使用具有相同名称但放置在两个不同位置的文件尝试此测试。如果返回不适当的结果,请检查应用程序服务器文档以了解可能影响类加载器行为的设置。

\n
\n\n

不要使用classpath:表单,因为您有多个类加载器位置templates/.

\n\n

参考:资源-类路径-通配符

\n