2010-01-30 101 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

相關問題