无法在可执行文件中访问资源

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)

Pau*_*tha 8

其他人使用正确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 MimeBodyPart,可以由一个构造InputStream(如Bill Shannon所建议,这是不正确的).如下面的评论中所述

"你也可以使用"附加数据"

mbp.setDataHandler(new DataHandler(new ByteArrayDataSource(
          this.getClass().getResourceAsStream("/Cloudy_Day.png", "image/png"))));
Run Code Online (Sandbox Code Playgroud)