【问题标题】:Accessing a resource within a jar (working in Netbeans but not on command line)访问 jar 中的资源(在 Netbeans 中工作,但不在命令行上)
【发布时间】:2011-01-11 05:09:24
【问题描述】:

我有一个 jar 文件,其中包含需要在运行时加载的捆绑资源(语言模型二进制文件)。 jar 内的目录结构是

标记器/app.class
标记器/models/stop/SentDetect.bin.gz

其中 SentDetect.bin.gz 是一个二进制文件,其路径作为字符串参数加载到第三方类(SentDetector)中,即

URL url = this.getClass().getResource("models/stop/SentDetect.bin.gz");
SentenceDetector sdetector = new SentenceDetector(url.getPath());

虽然它在 Netbeans 中运行正常,但当我尝试从命令行将它作为 jar 运行时,我在构造函数中收到 FileNotFound 异常。我已经仔细检查了二进制文件是否包含在编译的 Jar 文件中。

我相信解决方案通常是使用 getResourceAsStream() 将数据作为输入流加载,但这在这里不是一个选项,因为 url 作为字符串参数传递给第三方构造函数,这会导致我相信问题在于如何将 url 解析为字符串?

我试过了:

url.getPath();
url.getFile();
url.toURI().getPath();
url.toString();

并且所有人都给出了不同的文件路径。

【问题讨论】:

    标签: java resources jar file-not-found


    【解决方案1】:

    听起来应该没问题,如果二进制文件肯定在正确的位置并且 jar 文件肯定在类路径中。 (我假设它可以找到课程本身?我希望如此,因为您使用的是this.getClass())。

    可能导致问题的一件事是文件名大小写 - 当它从文件系统加载文件时,如果您使用的是不区分大小写的 Windows;在 jar 文件中,它会区分大小写。检查代码中的大小写是否与jar文件中的大小写匹配。

    【讨论】:

    • 您的意思是我可以使用加载了 jar 的应用程序外部的 URL 访问 jar 中的资源?
    • 是的,一切似乎都在它应该的位置,因为我从 Netbeans 运行应用程序没有问题,它只会在我打包它并在命令行上运行 jar 时出错。
    • @tangens:如果它是另一个 Java 应用程序,很有可能。在同一个 Java 应用程序中,但在不同的 jar 文件中 - 很可能。在普通的网络浏览器中?可能性要小得多。
    • 我以为你说的 URL 是空的?如果不是,则表明根本原因不同。
    • 抱歉打错了,我会编辑原文。 URL 不为空,它是有效路径。当我打印出 URL 时,我得到了一个绝对路径,例如:/a/b/c/nameofjar.jar!/tagger/models/stop/SentDetect.bin.gz,据我所知,这又是正确的。跨度>
    【解决方案2】:

    您无法通过java.io.File 访问 Jar 文件中的资源。您应该为SentenceDetector 提供一个替代构造函数,它要么接受InputStream 而不是String,要么接受URL 并使用URL.openStream() 来获得InputStream。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-27
      • 2016-08-05
      • 2017-09-24
      • 1970-01-01
      • 2019-08-31
      • 2016-09-09
      • 2021-06-27
      • 2018-03-25
      相关资源
      最近更新 更多