【问题标题】:Under Tomcat java.lang.NoClassDefFoundError when accessing a servlet?访问servlet时Tomcat java.lang.NoClassDefFoundError下?
【发布时间】:2010-10-25 20:06:34
【问题描述】:

我正在 Eclipse 中编写一个 Web 应用程序,并且我正在使用 XStream 序列化库来生成我的 JSON。

我已将构建 JSON 的代码封装在一个由我的 serverlet 调用的类中。然后封装的类有一个主要的测试方法,当我运行它时,一切似乎都正常。

但是,当我从我的servelet 调用类时,我得到一个java.lang.NoClassDefFoundError 错误,说我没有加载XStream 库。我假设我的构建路径错误,但我已将 XStream 库设置为项目的构建路径中,所以据我所知它应该可以工作。

这里可能出了什么问题?

以下是确切的例外:

java.lang.ClassNotFoundException: com.thoughtworks.xstream.io.HierarchicalStreamDriver
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    at SecurePaymentAjaxData.doPost(SecurePaymentAjaxData.java:44)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)

这里是使用 xstream 类的相关代码:

XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
xstream.alias("CallDataUpdate", CallDataUpdate.class);
xstream.alias("CardStatus", CardStatus.class);
String jsonData = xstream.toXML(updateData);

我强调这段代码在作为 java 应用程序运行时运行良好,我确信这与加载库有关,我只是不知道我哪里出错了。

【问题讨论】:

  • 包在你的WAR的WEB-INF/lib文件夹下吗?

标签: java eclipse tomcat xstream


【解决方案1】:

Java EE 模块依赖似乎是要走的路。但是,Eclipse Helios 中的菜单名称发生了变化:该特定菜单现在位于“部署程序集”下。

【讨论】:

    【解决方案2】:

    一个容易犯的错误是错误命名WEB_INF下的目录,我将它命名为libs而不是lib,编译正常但tomcat抛出错误。

    【讨论】:

      【解决方案3】:

      我发现了问题:

      如果您右键单击项目并选择属性,您可以设置“Java EE 模块依赖项”以包含您正在使用的模块。

      嘿,Presto,它有效。

      【讨论】:

      • 干得好。在幕后发生的事情是,这种依赖关系告诉编译器将这些库放入部署的 WEB-INF/lib 目录中(可能是 WAR 文件)。

        当应用程序在应用服务器上加载时 - 此路径默认包含在 Web 应用程序的类路径中,您的应用现在可以“看到”这些类库。
      • 请注意,此功能现在称为“部署程序集”,请参阅 stackoverflow.com/questions/3365369/…
      【解决方案4】:

      不要忘记构建部署的方式是不同的。也就是说,您可能正在针对 XStream 进行构建,但您也应该将其打包到 .war 文件中以进行部署。

      分解生成的 .war 文件(jar tvf {filename} 以查看内容)并检查它是否存在(WEB-INF/lib 下的 .jar 文件)。我怀疑不是。

      【讨论】:

        猜你喜欢
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        • 2019-06-08
        • 2010-11-26
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多