如何在JavaJAR中正确引用图像文件?

如何在JavaJAR中正确引用图像文件?,java,jpeg,Java,Jpeg,使用Java1.8,我正在处理一个SpringBootJAR文件,其中我使用xlsx4j包将一个图像文件包含到一个Excel文件中。我已经有了将图像文件添加到IDE中本地Excel文件的代码,问题是在我将代码编译成jar文件并部署到服务器后,它就不起作用了。我收到以下错误消息: java.io.FileNotFoundException: File 'file:/opt/app/lib/myjar.jar!/BOOT-INF/classes!/myimage.jpg' does not exis

使用Java1.8,我正在处理一个SpringBootJAR文件,其中我使用xlsx4j包将一个图像文件包含到一个Excel文件中。我已经有了将图像文件添加到IDE中本地Excel文件的代码,问题是在我将代码编译成jar文件并部署到服务器后,它就不起作用了。我收到以下错误消息:

java.io.FileNotFoundException: File 'file:/opt/app/lib/myjar.jar!/BOOT-INF/classes!/myimage.jpg' does not exist
图像文件存在于项目的src/main/resources文件夹中,下面是代码,我从中获取该文件的路径,并将其传递给将该文件附加到Excel文件的代码:

URL imageUrl = Resources.getResource("myimage.jpg");

SpreadsheetMLPackage pkg = SpreadsheetMLPackage.createPackage();

WorksheetPart workSheetPart = pkg.createWorksheetPart(new PartName("/xl/worksheets/sheet1.xml"), "Quote", 1);
Worksheet worksheet = workSheetPart.getContents();

Drawing drawingPart = new Drawing();
Relationship drawingRel = workSheetPart.addTargetPart(drawingPart);

org.xlsx4j.sml.CTDrawing drawing = org.xlsx4j.jaxb.Context.getsmlObjectFactory().createCTDrawing();
workSheetPart.getJaxbElement().setDrawing(drawing);
drawing.setId( drawingRel.getId() );

BinaryPartAbstractImage imagePart
    = BinaryPartAbstractImage.createImagePart(pkg, drawingPart,
            FileUtils.readFileToByteArray(new File(imageUrl.getPath()) ));      // Using path to image file here

String imageRelID = imagePart.getSourceRelationship().getId();

drawingPart.setJaxbElement(
        genericExcelUtil.buildDrawingPartContentUsingCode(imageRelID));
这是我在服务器上得到的stacktrace:

java.io.FileNotFoundException: File 'file:/opt/app/lib/myapp.jar!/BOOT-INF/classes!/myimage.jpg' does not exist
    at org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:292)
    at org.apache.commons.io.FileUtils.readFileToByteArray(FileUtils.java:1815)
    at com.myco.myapp.util.excel.FileImpl.generateExcel(FileImpl.java:113)
    at com.myco.myapp.service.impl.EmailServiceImpl.sendEmailService(EmailingServiceImpl.java:61)
    at com.myco.myapp.controller.MyController.sendEmailWithDoc(MyController.java:374)
file:/opt/app/lib/myapp.jar!/BOOT-INF/classes!/myimage.jpg
执行imageUrl.getPath的System.out.println时,在我的IDE中是这样的:

/C:/Users/userid/Documents/workspace-sts-3.9.3.RELEASE/myapp/target/classes/myimage.jpg
这是在服务器上运行时的外观:

java.io.FileNotFoundException: File 'file:/opt/app/lib/myapp.jar!/BOOT-INF/classes!/myimage.jpg' does not exist
    at org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:292)
    at org.apache.commons.io.FileUtils.readFileToByteArray(FileUtils.java:1815)
    at com.myco.myapp.util.excel.FileImpl.generateExcel(FileImpl.java:113)
    at com.myco.myapp.service.impl.EmailServiceImpl.sendEmailService(EmailingServiceImpl.java:61)
    at com.myco.myapp.controller.MyController.sendEmailWithDoc(MyController.java:374)
file:/opt/app/lib/myapp.jar!/BOOT-INF/classes!/myimage.jpg

新FileimageUrl.getPath似乎失败,因为从服务器运行时找不到该文件。关于如何处理这个问题有什么想法吗?

您必须通过类路径加载它

getClass().getResourceAsStream("/path/in/jar")

使用此处提供的建议,我能够打开图像文件的输入流,将该输入流的内容放入ByteArrayOutputStream,将ByteArrayOutputStream转换为字节数组,然后将字节数组提供给docx4j方法:

URL imageUrl = Resources.getResource("myimage.jpg");

InputStream imageInputStream = imageUrl.openStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = imageInputStream.read(data, 0, data.length)) != -1) {
    buffer.write(data, 0, nRead);
}
buffer.flush();
byte[] byteArray = buffer.toByteArray();

BinaryPartAbstractImage imagePart
= BinaryPartAbstractImage.createImagePart(pkg, drawingPart, byteArray);

String imageRelID = imagePart.getSourceRelationship().getId();

drawingPart.setJaxbElement(
    genericExcelUtil.buildDrawingPartContentUsingCode(imageRelID));
谢谢你的帮助

imageUrl.getPath未返回有效的文件名。使用URL的方法直接读取URL。