gpt4 book ai didi

java - 无法访问可执行 Jar 中的资源

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:29 33 4
gpt4 key购买 nike

谁能指出我在这里做错了什么。

我有一个生成和发送 HTML 电子邮件的小型天气应用程序。使用下面的代码,当我从 Eclipse 运行它时一切正常。我的电子邮件已生成,它能够访问我的图像资源并发送包含附件的电子邮件。

但是,当我通过运行 mvn install 构建可执行 jar 并使用 java -jar NameOfMyJar.jar 运行 jar 时,我得到了 java.io.FileNotFound 我的图像资源异常。

我知道我必须在访问图像资源的方式上做错了,我只是不明白为什么它在未打包时工作正常,但每当我将它打包到 jar 中时就会爆炸。

非常感谢任何建议。


我的项目布局 enter image description here


我如何访问我的图像资源

//Setup the ATTACHMENTS
MimeBodyPart attachmentsPart = new MimeBodyPart();
try {
attachmentsPart.attachFile("resources/Cloudy_Day.png");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

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

最佳答案

其他人使用getResourceAsStream 是正确的,但是路径有点棘手。您看到 resources 文件夹中的小包图标了吗?这表示 resource 文件夹中的所有文件都将放入类路径的根目录中。就像src/main/java中的所有包都放在根目录下一样。所以你会从路径中取出资源

InputStream is = getClass().getResourceAsStream("/Cloudy_Day.png");

旁白 Maven 有一个文件结构约定。类路径资源通常放在src/main/resources中。如果您在 src/main 中创建一个 resources 目录,Eclipse 应该会自动拾取它,并为路径 src/main/resource 创建小包图标 你应该在项目资源管理器中看到。这些文件也将进入根目录并可以以相同的方式访问。我会修复文件结构以遵循此约定。

注意: A MimeBodyPart , 可以是 Constructed来自 InputStream(根据 Bill Shannon 的建议,这是不正确的)。正如他在下面的评论中提到的

“您还可以使用附加数据”

mbp.setDataHandler(new DataHandler(new ByteArrayDataSource(
this.getClass().getResourceAsStream("/Cloudy_Day.png", "image/png"))));

关于java - 无法访问可执行 Jar 中的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27010487/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com