从Servlet调用Jackson解析器时获取ClassNotFoundException:com.fasterxml.jackson.core.JsonProcessingException

时间:2018-07-04 08:04:28

标签: java tomcat servlets jackson pom.xml

我有一个由Tomcat 8驱动的servlet,它需要一个静态方法来用Jackson 2.9.6进行JSON解析。

在执行代码期间:

JSONData parsedJSONData = PDFGenerator.parseJSONDocument(jsonDocument);

我得到:

java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException

值得注意的是,servlet类和PDFGenerator类位于不同的包中,但具有public访问修饰符。

我试图通过 pom.xml 将依赖项添加到项目的根目录:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.6</version>
</dependency>

但这没有帮助。

在我的项目中,我没有使用Maven,而是通过classpath添加了所需的库。

奇怪的是,只有当我尝试从servlet调用PDFGenerator.parseJSONDocument(jsonDocument)时,此类异常才会出现,而从常规Java类执行的过程却很顺利。

我的问题:
为了能够使用基于FasterXML / Jackson JSON库的JSON解析器功能调用静态方法,我应该在什么地方添加什么内容?

1 个答案:

答案 0 :(得分:1)

几乎可以肯定,此问题是由servlet容器(Tomcat 8.x)中的类装入器无法找到Jackson的库/ JAR引起的。在Servlet容器中装入类/库的方式与来自独立Java应用程序的标准类路径声明不同。这就是为什么您从servlet引擎看到错误,而不是在直接执行类的过程中看到错误的原因。以下是有关Tomcat 8.x如何处理类加载的常规文档:

https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

作为一般规则,首先要帮助防止此类问题,将servlet部署在“ webapp”容器中(包括所有必需的库(必需的JAR的适当版本等))是一个好主意。这样做会将您的servlet隔离在单个类加载器下,并自动将它们定位在正确的层次结构中。请参阅链接文档的这一部分:

  

WebappX —为部署在单个Tomcat实例中的每个Web应用程序创建一个类加载器。 Web应用程序的/ WEB-INF / classes目录中的所有解压缩的类和资源,以及Web应用程序的/ WEB-INF / lib目录下的JAR文件中的类和资源,对于此Web应用程序都是可见的,但不是给其他人。

仅供参考,企业级Web应用程序还有其他方法可以做到这一点,但我们在这里不做讨论。