Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Tomcat java.lang.NoClassDefFoundError下访问servlet时发生错误?_Java_Eclipse_Tomcat_Xstream - Fatal编程技术网

在Tomcat java.lang.NoClassDefFoundError下访问servlet时发生错误?

在Tomcat java.lang.NoClassDefFoundError下访问servlet时发生错误?,java,eclipse,tomcat,xstream,Java,Eclipse,Tomcat,Xstream,我正在Eclipse中编写一个web应用程序,并使用XStream序列化库生成JSON 我已经将构建JSON的代码封装在一个类中,该类由我的Servlet调用。然后封装的类有一个主要的测试方法,当我运行它时,一切似乎都很好 但是,当我从Servlet调用该类时,我得到一个java.lang.NoClassDefFoundError错误,表示我没有加载XStream库。我假设我的构建路径是错误的,但我已经将XStream库设置为项目的构建路径,就我所知,它应该可以工作 这里可能会出什么问题 以下是

我正在Eclipse中编写一个web应用程序,并使用XStream序列化库生成JSON

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

但是,当我从Servlet调用该类时,我得到一个
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应用程序运行时运行良好,我确信这与加载库有关,我只是不知道哪里出了问题。

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

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

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


嘿,这很管用。

一个容易犯的错误是错误地命名WEB\u INF下的目录,我将其命名为libs而不是lib,编译很好,但tomcat会抛出错误。

Java EE模块依赖性似乎是一种方法。然而,Eclipse Helios中的菜单名称发生了变化:该特定菜单现在位于“部署组件”下。

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

当应用程序加载到应用程序服务器上时-默认情况下,此路径包含在web应用程序的类路径中,您的应用程序现在可以“查看”这些类库。请注意,此功能现在称为“部署程序集”。请参见WAR的web-INF/lib文件夹中的包?