从 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 应用程序,还有其他方法可以做到这一点,但我们不在这里讨论。
我有一个由 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 应用程序,还有其他方法可以做到这一点,但我们不在这里讨论。