4

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

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

我知道我应该使用 getResourceAsStream(),但由于一些限制,我不能(与文件的保存方式有关,我正在阅读整个 pdf 文件,而不是流)所以我想知道如何将我的文件放入 jar 中的正确位置。如果我在制作完成后将其解压缩,它们总是显示在文件夹之外的顶层。这是我当前项目结构的屏幕截图。为了说明这一点,这个项目在 eclipse 中运行良好,也在 java 构建属性中,源文件夹与所有子文件夹一起在构建路径中,我也尝试在之前的测试中对空的资源文件夹做同样的事情。 在此处输入图像描述

4

2 回答 2

6

您将需要执行 getResourceAsStream,并确保将 pdf 文件构建到 jar 中。由于您将它们放在源文件夹中,因此它们应该。

假设您在 src/resources/orderForm.pdf 下有 pdf,它将以 /resources/orderForm.pdf 的形式出现在 jar 文件中。您将为 /resources/orderForm.pdf 打开一个资源流。

如果您必须有一个诚实至善的文件,那么您需要将 PDF 作为资源流读取的代码,FileOutputStreams 将其输出到一个临时文件,然后使用该文件。或者,您根本无法将 pdf 打包到 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 文件夹是一个真正的文件夹,但是当你构建这个东西时,它都会被压缩到一个 jar 中。

也许对源文件夹有点困惑。如果您有一个名为“src”的源文件夹,则其下的包结构不包含“src”。src/net/whatever/Class.java 在构建时会变成 net/whatever/Class.class。

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

于 2013-01-31T23:43:32.923 回答
1

为了方便从 Eclipse 中导出而不需要经常考虑它,我建议将资源文件夹放在该文件夹下src。长话短说,如果你不把它放在你的src文件夹中,每次你创建一个 jar 时,你都需要选中resources文件夹旁边的框。所以只要把它放在src文件夹中,就可以省去一些麻烦。

至于引用文件,我会尝试

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

这允许您访问src/resources/finished.pdf.

于 2013-01-31T23:39:53.783 回答