【问题标题】:Runnable JAR file not found exception找不到可运行的 JAR 文件异常
【发布时间】:2013-01-16 05:20:54
【问题描述】:

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

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

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

【问题讨论】:

  • “我不断收到文件未找到异常” 档案中的资源称为嵌入式资源。请参阅embedded-resource info page 了解如何继续。

标签: java embedded-resource


【解决方案1】:

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

假设您在 src/resources/orderForm.pdf 下有 pdf,它将在 jar 文件中作为 /resources/orderForm.pdf 结束。您将为 /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。 rsrc/resources/order.pdf 将在您构建 jar 时变为 resources.order.pdf。

【讨论】:

  • 我“需要”该文件的主要原因是因为 pdf 实际上是一个表单,然后我调用该表单,填充它,然后提供它,基本上作为一个模板。我曾考虑使用 getResourceAsSream,但主要缺点(或我找不到的东西)是如何将其流式传输到临时文件,但听起来这正是我应该做的,你能发布一个例子吗?
  • 添加了示例代码 - 这将打开一个资源流,写入一个临时文件,然后在 Acrobat Reader 中打开该文件。根据需要更改文件路径!
【解决方案2】:

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

至于引用文件,我会尝试

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

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

【讨论】:

  • 它目前在src文件夹中,在上图中我相信它显示了它吗?除非它们在子文件夹中而不是真正在 src 文件夹中?
  • 您在 src 和项目的根目录下有一个资源文件夹。我建议只将它放在 src 下(这是您填充的资源文件夹当前所在的位置)
猜你喜欢
  • 2013-04-12
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多