找不到Runnable JAR文件异常

时间:2013-01-31 23:32:24

标签: java embedded-resource

我想知道如何在Eclipse中的源包内部或外部的资源文件夹中创建一个带有资源(图片,pdf)的可运行JAR(即/ src / resources / images /或/ resources / images /) 。目前,我的资源在我的eclipse项目的源文件夹中,但我也在它自己的包中的文件夹中尝试过。该程序在eclipse中构建并执行正常,但是当我作为可运行的jar导出时,我在桌面上运行它时会不断收到文件未找到异常。我用这样的字符串声明我的文件

private String file =  "src/resources/orderForm.pdf";

我明白我应该使用getResourceAsStream(),但是由于一些限制,我不能(与文件的保存方式有关,我正在阅读整个pdf文件,而不是作为流)所以我是想知道如何将我的文件放入jar中的正确位置。如果我在制作完成后打开它,它们总是出现在文件夹之外的顶层。这是我当前项目结构的屏幕截图。为了说它,这个项目在eclipse中工作正常,在java构建属性中,源文件夹与所有子文件夹一起在构建路径中,我也尝试在早期测试中对空资源文件夹做同样的事情。 enter image description here

2 个答案:

答案 0 :(得分:6)

您需要执行getResourceAsStream,并确保将pdf内置到jar中。因为你在源文件夹中有它们,所以它们应该。

假设你在src / resources / orderForm.pdf下有pdf,它最终将作为/resources/orderForm.pdf放在jar文件中。您将为/resources/orderForm.pdf打开资源流。

如果你必须有一个诚实的善良文件,那么你需要将PDF作为资源流读取的代码,FileOutput将其输出到临时文件,然后使用该文件。或者,你根本无法将jar包装在jar中。

public class PDFWriter {

public static final String testDir = "C:\\pdftest\\"; 
public static final String adobePath = "\"C:\\Program Files\\Adobe\\Reader 10.0\\Reader\\AcroRd32.exe\"";

public static void main(String[] args){

    try {
        new PDFWriter().run();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void run() throws Exception {
    InputStream in = this.getClass().getResourceAsStream("/resources/test.pdf");
    new File(testDir).mkdirs();
    String pdfFilePath = testDir + "test.pdf";
    FileOutputStream out = new FileOutputStream (pdfFilePath);
    byte[] buffer = new byte[1024];
    int len = in.read(buffer);
    while (len != -1) {
        out.write(buffer, 0, len);
        len = in.read(buffer);
    }
    out.close();

    Runtime rt = Runtime.getRuntime();
    String command = adobePath + " " + pdfFilePath;
    rt.exec(command);
}

}

文件方式在eclipse中运行的唯一原因是因为bin文件夹是一个真正的文件夹,但是当你构建这个东西时,它们都会被压缩到一个罐子里。

对源文件夹可能有点混乱。如果你有一个名为'src'的源文件夹,它下面的包结构不包含“src”。 src / net / whatever / Class.java在构建时将变为net / whatever / Class.class。

因此,您可以创建一个名为'rsrc'(资源)的第二个源文件夹,并在此下放置您的resources / order.pdf。构建jar时,rsrc / resources / order.pdf将成为resources.order.pdf。

答案 1 :(得分:1)

为了便于从Eclipse中轻松导出而不经常考虑,我建议将resources文件夹放在src文件夹下。简而言之,如果你没有把它放在src文件夹中,每次创建一个jar时,都需要选中resources文件夹旁边的复选框。所以只需将它放在src文件夹中,为自己省去一些问题。

至于引用文件,我会尝试

private String file = "resources/finished.pdf";

这允许您访问src/resources/finished.pdf下的文件。