Chi*_*int 7 java jar jakarta-mail filenotfoundexception maven
有人可以指出我在这里做错了什么.
我有一个小天气应用程序,生成并发送HTML电子邮件.使用下面的代码,当我从Eclipse运行它时,一切正常.我的电子邮件生成后,它可以访问我的图像资源,并发送包含附件的电子邮件.
但是,当我通过运行mvn install构建可执行jar 并使用java -jar NameOfMyJar.jar运行jar时,我的图像资源获得了java.io.FileNotFound异常.
我知道我必须对我如何访问我的图像资源做错了,我只是不明白为什么它在没有打包的情况下工作正常,但每当我将它打包到一个罐子里时都会爆炸.
任何建议都非常感谢.
我的项目布局

我如何访问我的图像资源
//Setup the ATTACHMENTS
MimeBodyPart attachmentsPart = new MimeBodyPart();
try {
attachmentsPart.attachFile("resources/Cloudy_Day.png");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
StackTrace
Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: IOException while sending message;
nested exception is:
java.io.FileNotFoundException: resources/Cloudy_Day.png (No such file or directory)
at Utilities.SendEmailUsingGmailSMTP.SendTheEmail(SendEmailUsingGmailSMTP.java:139)
at Utilities.SendEmailUsingGmailSMTP.SendWeatherEmail(SendEmailUsingGmailSMTP.java:66)
at Weather.Main.start(Main.java:43)
at Weather.Main.main(Main.java:23)
Caused by: javax.mail.MessagingException: IOException while sending message;
nested exception is:
java.io.FileNotFoundException: resources/Cloudy_Day.png (No such file or directory)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1167)
at javax.mail.Transport.send0(Transport.java:195)
at javax.mail.Transport.send(Transport.java:124)
at Utilities.SendEmailUsingGmailSMTP.SendTheEmail(SendEmailUsingGmailSMTP.java:134)
... 3 more
Caused by: java.io.FileNotFoundException: resources/Cloudy_Day.png (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at javax.activation.FileDataSource.getInputStream(FileDataSource.java:97)
at javax.activation.DataHandler.writeTo(DataHandler.java:305)
at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1485)
at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:865)
at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:462)
at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:103)
at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:889)
at javax.activation.DataHandler.writeTo(DataHandler.java:317)
at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1485)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1773)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1119)
... 6 more
Run Code Online (Sandbox Code Playgroud)
其他人使用正确getResourceAsStream,但路径有点棘手.你看到resources文件夹中的小包装图标?这表示文件resource夹中的所有文件都将放入类路径的根目录中.就像所有的包src/main/java都放在root中一样.所以你会resources从路径中取出
InputStream is = getClass().getResourceAsStream("/Cloudy_Day.png");
Run Code Online (Sandbox Code Playgroud)
抛开: Maven有一个文件结构约定.通常会放入类路径资源src/main/resources.如果您resources在其中创建目录src/main,Eclipse应自动选择它,并为src/main/resource您应在项目资源管理器中看到的路径创建小包图标.这些文件也会转到root,并且可以以相同的方式访问.我会修复文件结构以遵循此约定.
注意: A (如Bill Shannon所建议,这是不正确的).如下面的评论中所述MimeBodyPart,可以由一个构造InputStream
"你也可以使用"附加数据"
mbp.setDataHandler(new DataHandler(new ByteArrayDataSource(
this.getClass().getResourceAsStream("/Cloudy_Day.png", "image/png"))));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3740 次 |
| 最近记录: |