代码之家  ›  专栏  ›  技术社区  ›  Mike Omeiri Kouider

从servlet调用jackson json解析器时获取classnotfoundexception:com.fasterxml.jackson.core.jsonprocessingexception

  •  0
  • Mike Omeiri Kouider  · 技术社区  · 6 年前

    我有一个servlet,由tomcat 8支持,它调用一个静态方法来执行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 是的。

    奇怪的是,只有当我试图调用 PDFGenerator.parseJSONDocument(jsonDocument) 从一个servlet中,从一个普通的java类执行可以顺利地工作。

    我的问题是:
    为了能够使用基于fasterxml/jackson json库的json解析器功能调用静态方法,我应该添加什么和在哪里添加?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Greg T.    6 年前

    这个问题几乎肯定是由servlet容器(tomcat 8.x)中的类装入器无法找到jackson的库/jar造成的。在servlet容器中加载类/libs的方式不同于独立java应用程序中的标准类路径声明。这就是为什么您看到来自servlet引擎的错误,而不是在直接执行类的过程中。下面是关于Tomcat8.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应用程序,还有其他方法可以做到这一点,但我们这里不讨论这一点。