无法访问可执行Jar中的资源 [英] Can't Access Resources In Executable Jar
问题描述
有人可以指出我在这里做错了吗.
Can someone please point out what I'm doing wrong here.
我有一个小型天气应用程序,可以生成并发送HTML电子邮件.在下面的代码中,当我从Eclipse运行它时,一切工作正常.我的电子邮件生成了,它可以访问我的图像资源,并发送包含附件的电子邮件.
I have a small weather app that generates and sends an HTML email. With my code below, everything works fine when I run it from Eclipse. My email gets generated, it's able to access my image resources and it sends the email with the included attachment.
但是,当我通过运行 mvn install 构建可执行jar并使用 java -jar NameOfMyJar.jar 运行jar时,会得到 java.io.FileNotFound我的图片资源例外.
However, when I build the executable jar by running mvn install and run the jar using java -jar NameOfMyJar.jar I get java.io.FileNotFound Exceptions for my image resource.
我知道我在访问图像资源时必须做一些事情,我只是不明白为什么在未包装时它可以正常工作,但是每当我将其包装到罐子中时都会炸毁.
I know that I have to be doing something wrong with how I'm accessing my image resources, I just don't understand why it works fine when it's not packaged, but bombs out whenever I package it into a jar.
非常感谢任何建议.
我的项目布局
我如何访问图片资源
//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
中的所有包都放在根目录中一样.因此,您将从路径中删除资源
Others are correct with the use of getResourceAsStream
, but the path is a little tricky. You see the little package icon in the resources
folder? That signifies that all the files in the resource
folder will be put into the root of the classpath. Just like all the packages in src/main/java
are put in the root. So you would take out the resources
from the path
InputStream is = getClass().getResourceAsStream("/Cloudy_Day.png");
旁白: Maven具有文件结构约定.类路径资源通常放在 src/main/resources
中.如果您在 src/main
中创建一个 resources
目录,则Eclipse应该自动将其拾取,并为路径 src/main/resource创建小包图标.
您应该在项目浏览器中看到.这些文件也将进入根目录,并且可以通过相同的方式进行访问.我将修复文件结构以遵循此约定.
An aside: Maven has a file structure conventions. Class path resources are usually put into src/main/resources
. If you create a resources
dir in the src/main
, Eclipse should automatically pick it up, and create the little package icon for a path src/main/resource
that you should see in the project explorer. These files would also go to the root and could be accessed the same way. I would fix the file structure to follow this convention.
注意:A 由构造()(如Bill Shannon所建议的那样,这是不正确的).正如他在下面的评论中所述 InputStream
Note: A (As suggested by Bill Shannon, this is incorrect). As mentioned in his comment belowMimeBodyPart
, can be Constructed from an InputStream
您还可以使用"来附加数据
"You can also attach the data using"
mbp.setDataHandler(new DataHandler(new ByteArrayDataSource(
this.getClass().getResourceAsStream("/Cloudy_Day.png", "image/png"))));
这篇关于无法访问可执行Jar中的资源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!