我有一个使用以下代码的类:
@Value(value = "classpath:mail_template.html")
private Resource template;
根据this教程这将允许我使用 template.getInputStream()
从我的 jar 文件内的文件中获取数据。这工作正常,直到另一个 mail_template.html
已添加到另一个模块中。
我的应用程序有 main_application
who 的 POM 具有其他模块作为依赖项。结构如下:
main_application
|
- modulue_1 (another module)
|
- src/main/java
- src/main/resources
|
- mail_template.html
- modulue_2 (my module)
|
- src/main/java
- src/main/resources
|
- mail_template.html
所以现在我的类使用 module_1 的 mail_template.html
而不是我模块中的那个。据我了解,这是正确的行为,因为 module_1 首先加载,并且 @Value
被注入(inject)第一个 mail_template.html
它找到了,但在我的情况下这是不正确的,因为它覆盖了 module_2(以及后续模块)中与 module_1 中具有相同名称的资源。
是否可以指定使用当前类(或模块)来查找 src/main/resources
中的资源@Value
目录中注解?或者我必须对每个模块中的每个资源进行唯一命名以避免此问题?
我尝试了许多不同的“classpath:”路线,包括:
@Value(value = "classpath:module_2/mail_template.html")
....
@Value(value = "classpath*:mail_template.html")
...
@Value(value = "classpath*:module_2/mail_template.html")
但是所有这些都会导致FileNotFoundException
.
编辑
各模块组成如下:
Maven POM Project
Maven Java Application
src/main/java
base.package.with.module.name.as.suffix.package
src/main/resources
resource_files_if_needed
如上所述,每个模块都在 Maven Java 应用程序下声明为依赖项 main_application
每个 Maven Java 应用程序都使用一个“基础包”,并以模块名称作为后缀。
例如:
// main_application:
package my.main.application
// module_1:
package my.main.application.module1
// module_2:
package my.main.application.module2
使用此属性,Spring 可以使用 @Component
加载类。使用 <context:component-scan base-package="my.main.application" />
进行注释在配置文件中。
最佳答案
类路径中只能有一个 mail_template.html。对于具有相同包和类名的类也是如此。
我建议我们在资源目录中使用不同的目录名称。
关于java - Spring 类路径资源被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56468642/