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

Getting ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException when calling Jackson JSON parser from a servlet

我有一个由 Tomcat 8 提供支持的 servlet,它需要一个静态方法来使用 Jackson 2.9.6 执行 JSON 解析。

代码执行期间:

JSONData parsedJSONData = PDFGenerator.parseJSONDocument(jsonDocument);

我得到:

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

请务必注意,servlet class 和 PDFGenerator class 位于不同的包中,但具有 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-class 执行时运行顺利。

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

这个问题几乎可以肯定是由于您的 servlet 容器 (Tomcat 8.x) 中的 classloader 无法找到 Jackson 的 library/JAR。 classes/libs 在 servlet 容器中加载的方式不同于来自独立 Java 应用程序的标准 classpath 声明。这就是为什么您看到来自 servlet 引擎的错误,而不是在您直接执行 class 期间看到的错误。这是关于 Tomcat 8.x 如何处理 class 加载的一般文档:

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

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

WebappX — A class loader is created for each web application that is deployed in a single Tomcat instance. All unpacked classes and resources in the /WEB-INF/classes directory of your web application, plus classes and resources in JAR files under the /WEB-INF/lib directory of your web application, are made visible to this web application, but not to other ones.

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