Java Getting ClassNotFoundException:com.fasterxml.jackson.core.JsonProcessingException从servlet调用jackson JSON解析器时

Java Getting ClassNotFoundException:com.fasterxml.jackson.core.JsonProcessingException从servlet调用jackson JSON解析器时,java,tomcat,servlets,jackson,pom.xml,Java,Tomcat,Servlets,Jackson,Pom.xml,我有一个由Tomcat8支持的servlet,它调用一个静态方法来使用Jackson 2.9.6执行JSON解析 在代码执行期间: JSONData parsedJSONData = PDFGenerator.parseJSONDocument(jsonDocument); 我得到: java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException 需要注意的是,servlet类和PDFG

我有一个由Tomcat8支持的servlet,它调用一个静态方法来使用Jackson 2.9.6执行JSON解析

在代码执行期间:

JSONData parsedJSONData = PDFGenerator.parseJSONDocument(jsonDocument);
我得到:

java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException
需要注意的是,servlet类和
PDFGenerator
类位于不同的包中,但具有
public
访问修饰符

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


com.fasterxml.jackson.core
杰克逊核心
2.9.6
但这没用

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

奇怪的是,只有当我试图从servlet调用
PDFGenerator.parseJSONDocument(jsonDocument)
时,这种异常才会出现,而从常规Java类执行时,这种异常会顺利进行

我的问题:

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

这个问题几乎肯定是由于servlet容器(Tomcat 8.x)中的类加载器无法找到Jackson的库/JAR造成的。在servlet容器中加载类/lib的方式不同于独立Java应用程序的标准类路径声明。这就是为什么您会在servlet引擎中看到错误,而不是在直接执行类的过程中看到错误。以下是关于Tomcat 8.x如何处理类加载的一般文档:

一般来说,为了从一开始就有助于防止此类问题,最好在“webapp”容器中部署servlet,其中包括所有必需的库(所需JAR的适当版本等)。这样做会将servlet隔离在单个类加载器下,并自动将它们定位到正确的层次结构中。请参阅链接文档的这一部分:

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


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

这类问题通常是由与servlet引擎类加载器关联的代码的打包问题引起的。在安装到servlet引擎时,代码是如何打包的?出现错误时,您使用的是哪个servlet引擎?@GregT.,我正在使用Tomcat8运行servlet。Servlet类和
PDFGenerator
类位于不同的包中,但带有
public
access修饰符。感谢链接到参考。一行解决方案是将所有必需的JAR复制到
/WEB-INF/lib
并重新启动Tomcat。是的,这将解决依赖关系。请记住,这只是一个快速解决方案。如果稍后在同一Tomcat实例上开始运行更多servlet,则可能会由于共享类加载器而产生依赖冲突(除非使用Webapp部署)。