访问jar中的资源(在Netbeans中工作但不在命令行上)

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

恶搞/ app.class
恶搞/模型/停止/ SentDetect.bin.gz

其中SentDetect.bin.gz是一个二进制的whos路径作为String参数加载到第三方类(SentDetector),即

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

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

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

我试过了:

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

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

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

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

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