有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java获取ClassNotFoundException:com。fasterxml。杰克逊。果心从servlet调用Jackson JSON解析器时发生JsonProcessingException

我有一个由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:

<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) 个答案

  1. # 1 楼答案

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

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

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

    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.

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