java - 为什么无法从 WEB-INF 文件夹中加载 POSModel 文件?

标签 java tomcat servlets opennlp resource-loading

我正在为我的 Web 项目使用 Spring MVC。我将模型文件放在 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

访问文件资源的最佳方式是什么?谢谢

最佳答案

假设您使用的是 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));

请参阅 ServletContext#getResourceAsStream 的 Javadoc还有这个StackOverflow post .

重要提示

遗憾的是,您的代码还有其他问题。 OpenNLP 类 POSModelLoader 仅供内部使用,请参阅官方 Javadoc POSModelLoader :

Loads a POS Tagger Model for the command line tools.

Note: Do not use this class, internal use only!

因此,在 Web 上下文中加载 POSModel 应该以不同的方式完成:通过可用的 constructors of that class 之一。 .您可以像这样重新表述上面的代码片段:

try {
    InputStream in = servletContext.getResourceAsStream(taggerModelPath);
    POSModel posModel;
    if(in != null) {
        posModel = new POSModel(in);
        
        // from here, <posModel> is initialized and you can start playing with it...
        // ...
    }
    else {
        // resource file not found - whatever you want to do in this case
    }
}
catch (IOException | InvalidFormatException ex) {
    // proper exception handling here... cause: getResourcesAsStream or OpenNLP...
} 

这样,您就符合 OpenNLP API 的要求,同时您可以进行适当的异常处理。此外,如果您的模型文件的资源路径引用仍然不清楚,您现在可以使用调试器。

希望对您有所帮助。

关于java - 为什么无法从 WEB-INF 文件夹中加载 POSModel 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32148328/

相关文章:

java - Shell 将参数传递给带参数运行的 java

java - 在类上注释时,如何配置 lombok 以生成静态成员的 Getter/Setter

java - 如何使用 xmlhttprequest 从 javascript 将字符串发送到 servlet

java - 迭代器不返回 Jess servlet 应用程序的结果

java - Box2d 主体填充有纹理 Libgdx

java - 为什么输入流以 block 的形式读取数据?

tomcat - Hudson 日志进入 stderr 并且也没有滚动

java - Java 8中tomcat jvm的输出Java Real memory usage

database - 如何使用命令行使用凭据连接到 Docker 容器?

java - 带有 Ajax 的 Servlet - POST 有效,但 GET 无效