2015-08-21 68 views
0

我爲我的web項目使用Spring MVC。我將模型文件放在WEB-INF目錄中爲什麼加載POSModel文件不能在WEB-INF文件夾中工作?

String taggerModelPath = "/WEB-INF/lib/en-pos-maxent.bin"; 
String chunkerModelPath = "/WEB-INF/lib/en-chunker.bin"; 

POSModel model = new POSModelLoader() 
.load(new File(servletContext.getResource(taggerModelPath).toURI().getPath())); 

這工作的Windows環境。但是,當我將它部署在遠程Linux服務器上時,出現錯誤

HTTP狀態500 - 請求處理失敗;嵌套異常是opennlp.tools.cmdline.TerminateToolException:POS Tagger模型文件不存在!路徑:/localhost/nlp/WEB-INF/lib/en-pos-maxent.bin

什麼是訪問文件資源的最佳方式?謝謝

+0

該文件是否存在於遠程Linux服務器上? – Makoto

+0

是的,它位於WEB-INF/lib文件夾內。 – Yangrui

回答

3

假設您使用OpenNLP 1.5.3,那麼您應該使用另一種加載資源文件的方式,它不使用通過URI轉換的「硬」路徑引用。

鑑於該目錄WEB-INF中的另一個目錄resources存在包含您的OpenNLP模型文件的環境中,你的代碼片段應該寫入如下:

String taggerModelPath = "/WEB-INF/resources/en-pos-maxent.bin"; 
String chunkerModelPath= "/WEB-INF/resources/en-chunker.bin"; 

POSModel model = new POSModelLoader().load(servletContext.getResourceAsStream(taggerModelPath)); 

見的Javadoc ServletContext#getResourceAsStreamStackOverflow post

重要提示

可悲的是,也有你的代碼的其他問題。該OpenNLP類POSModelLoader僅供內部使用,請參閱POSModelLoader官方的Javadoc:

加載一個POS標註器模型的命令行工具。

注意:請勿使用此類,僅供內部使用!

因此,在Web上下文加載POSModel應該怎樣做:可用constructors of that class經由一個。您可以重新制定上面的代碼片段,像這樣:

這樣,你符合的OpenNLP API和你做適當的異常處理的同時。而且,如果模型文件的資源路徑引用仍然不清楚,現在可以使用調試器。

希望它有幫助。

+0

謝謝我的朋友!看來我的應用每次查詢時都會加載opennlp模型。我應該使用單身模式嗎? – Yangrui

+2

您可以在當前類的構造函數中調用上述代碼,並在需要時將posmodel引用爲字段以供使用。因此,它應該只加載一次。其他想法通常需要詳細瞭解應用程序體系結構。 – MWiesner

相關問題