我們的程序正在發送郵件。爲了發送郵件,它包含一個附件。在測試用例中使用Spring資源加載器運行maven的FileNotFoundException
該項目設置與maven。 JUnit測試用例首先加載彈簧配置。 Spring正在使用它的DefaultResourceLoader加載文件。當直接在工作區內運行它時,它運行良好,但是作爲maven測試它會失敗。
春天的配置資源加載器:
<property name="defaultResourceLoader">
<bean class="org.springframework.core.io.DefaultResourceLoader" />
</property>
ImplementingClass:
@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]無法解析爲絕對文件路徑,因爲它不駐留在f中ILE系統中:jar:文件:/ C:/IBM/workspace/efMy10/ef-mvxsrv-reactor/ef-mvxsrv-service-resources/target/ef-mvxsrv-service-resources-1.5.23-SNAPSHOT.jar /模板/ efmaillogo.jpg 在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:\用戶\ uhe.m2 \庫\ COM \ clavisit \ EF \ mvxsrv \ EF-mvxsrv服務資源\ 1.5.23-SNAPSHOT \ EF - mvxsrv服務資源-1.5.23-SNAPSHOT.jar!\模板\ efmaillogo.jpg(文件名,目錄名或卷標語法不正確。) 在com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport .java:1141) at javax.mail.Transport.send0(Transport.java:195) at javax.mail.Transport.send(Transport.java:124) at com.clavisit.ef.ep.service.integration .handler.mail.SendMail.sendMessage(SendMail.java:153)
即使EAR展開工作,想必罐子仍然是一個罐子?在這種情況下,圖像在jar中的服務器上找到,但在使用Maven的jar內找不到圖像? –
剛剛發現了它在服務器上工作的原因。它被放置在WEB-INF /類中。 –