我有一个由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解析器功能调用静态方法,我应该在什么地方添加什么内容?
答案 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应用程序还有其他方法可以做到这一点,但我们在这里不做讨论。