2015-08-21 69 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

相关问题