在Tomcat java.lang.NoClassDefFoundError下访问servlet时发生错误?
我正在Eclipse中编写一个web应用程序,并使用XStream序列化库生成JSON 我已经将构建JSON的代码封装在一个类中,该类由我的Servlet调用。然后封装的类有一个主要的测试方法,当我运行它时,一切似乎都很好 但是,当我从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库设置为项目的构建路径,就我所知,它应该可以工作 这里可能会出什么问题 以下是
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文件夹中的包?