2010-01-30 69 views
1

我有一个jar文件,其中包含需要在运行时加载的资源(语言模型二进制文件)。罐子内的目录结构是在一个jar中工作(在Netbeans中工作,但不在命令行中)

标记器/ app.class
标记器/模型/停止/ SentDetect.bin.gz

其中SentDetect.bin.gz是二进制卫生组织路径被装载到第三方类(SentDetector)作为字符串参数,即

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

虽然它运行正常在NetBeans中,当我尝试运行它作为命令行罐子,我会在构造一个FileNotFound例外。我已经仔细检查了二进制文件是否包含在已编译的Jar文件中。

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

我曾尝试:

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

并且都给人以文件不同的路径。

回答

1

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

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

+0

你的意思是我可以使用来自已加载jar的应用程序外部的URL访问jar中的资源? – tangens 2010-01-30 15:06:51

+0

是的一切似乎都应该在哪里,因为我没有任何问题从Netbeans运行应用程序,它只会在我将它打包并在命令行上运行该jar时出现错误。 – pastylegs 2010-01-30 15:10:20

+0

@tangens:如果它是另一个Java应用程序,很可能。在同一个Java应用程序中,但是不同的jar文件 - 很可能。在普通的网络浏览器中?可能性更小。 – 2010-01-30 15:10:46

0

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

相关问题