1

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

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

其中 SentDetect.bin.gz 是二进制 whos 路径作为字符串参数加载到第三方类 (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();

并且所有人都在为文件提供不同的路径。

4

2 回答 2

1

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

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

于 2010-01-30T15:00:53.403 回答
0

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

于 2012-06-06T21:44:03.710 回答