我们的程序正在发送邮件。对于发送邮件,它包含一个附件。
该项目是用maven设置的。JUnit 测试用例首先加载 spring 配置。Spring 正在使用其DefaultResourceLoader加载文件。当直接在工作区中运行它时,它运行良好,但是作为一个 Maven 测试它失败了。
资源加载器的 Spring 配置:
<property name="defaultResourceLoader">
<bean class="org.springframework.core.io.DefaultResourceLoader" />
</property>
实施类:
@Service
public class SomeClassA {
@Autowired
private DefaultResourceLoader defaultResourceLoader;
@Value("${mailLogoPath}")
private String mailLogo;
public void someMethod(){
String filePath = defaultResourceLoader.getResource(mailLogo).getFile().getAbsolutePath();
}
}
异常指向实际问题和区别:
java.io.FileNotFoundException:类路径资源 [templates/efmaillogo.jpg] 无法解析为绝对文件路径,因为它不驻留在文件系统中:jar:file:/C:/IBM/workspace/efMy10/ef-mvxsrv -reactor/ef-mvxsrv-service-resources/target/ef-mvxsrv-service-resources-1.5.23-SNAPSHOT.jar!/templates/efmaillogo.jpg at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java: 204) 在 org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52) 在 SomeClassA.someMethod(SomeClassA.java:9)
Spring 尝试在 jar 中查找文件。在 eclipse 中将其作为 junit 测试运行时,一切正常,因为 spring 直接在工作区中找到该文件。但是,当使用 maven 运行相同的单元测试时,它会失败,因为它找不到文件,因为它在不同模块的 jar 中。另一个模块中的文件是不同模块需要的,所以我不想移动它。在部署了所有内容的应用程序服务器上,它也可以正常工作,因为 .ear 文件已展开。
我想知道是否有其他方法可以使用 Spring 访问文件,这样我就不必使用 maven 跳过这个测试用例。
更新 尝试使用以下方法查找文件:
String filePath = defaultResourceLoader.getResource(mailLogo).getURL.getFile();
但是,它现在在实际发送邮件时失败了Transport.send(msg)
。
java.io.FileNotFoundException: 文件:\C:\Users\uhe.m2\repository\com\clavisit\ef\mvxsrv\ef-mvxsrv-service-resources\1.5.23-SNAPSHOT\ef-mvxsrv-service-resources- 1.5.23-SNAPSHOT.jar!\templates\efmaillogo.jpg(文件名、目录名或卷标语法不正确。)在 com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1141) at javax .mail.Transport.send0(Transport.java:195) 在 javax.mail.Transport.send(Transport.java:124) 在 com.clavisit.ef.ep.service.integration.handler.mail.SendMail.sendMessage(SendMail .java:153)