简体   繁体   English

在访问servlet时,在Tomcat java.lang.NoClassDefFoundError下?

[英]Under Tomcat java.lang.NoClassDefFoundError when accessing a servlet?

I'm writing a web applicaion in Eclipse, and I'm using the XStream Serialization Library to generate My JSON. 我正在Eclipse中编写Web应用程序,我正在使用XStream序列化库来生成My JSON。

I've encapsulated the Code that builds up the JSON in a class which is called by my servelet. 我已经封装了在我的servelet调用的类中构建JSON的代码。 Then encapsulated class has a main method for testing and when I run it everything seems to work fine. 然后封装类有一个主要的测试方法,当我运行它时,一切似乎工作正常。

However when I use the call the class from my servelet I get a java.lang.NoClassDefFoundError error, sayying that I've not loaded the XStream libraries. 但是,当我使用调用我的servelet中的类时,我得到一个java.lang.NoClassDefFoundError错误,说我没有加载XStream库。 I assume I've got my build path wrong, but I've set the XStream libraries to be in the build path for the project, so as far as I know it should work. 我假设我的构建路径有问题,但我已将XStream库设置为项目的构建路径,因此据我所知它应该可行。

What is likely to be going wrong here? 这里可能出现什么问题?

Following is the exact exception: 以下是确切的例外:

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)

And here is the relavant code that uses the xstream class: 这是使用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);

I stress that this code works fine when run as a java application, I'm sure it's something to do with loading the libraries, I just don't know where I've gone wrong. 我强调这个代码在作为java应用程序运行时工作正常,我确定它与加载库有关,我只是不知道我哪里出错了。

Don't forget that there's a difference between how you build and how you deploy . 不要忘记构建方式部署方式之间存在差异。 That is, you may be building against XStream, but you should also package it in the .war file for deployment. 也就是说,您可能正在构建针对XStream的构建,但您还应将其打包在.war文件中以进行部署。

Explode your resultant .war file ( jar tvf {filename} to see the contents) and check whether it's there (a .jar file under WEB-INF/lib ). 分解你生成的.war文件( jar tvf {filename}以查看内容)并检查它是否存在( WEB-INF/lib下的.jar文件)。 I suspect it's not. 我怀疑它不是。

I found the issue: 我发现了这个问题:

If you right click on the project and select properties you can set the "Java EE Module dependencies" to include the modules you are using. 如果右键单击项目并选择属性,则可以设置“Java EE模块依赖项”以包括您正在使用的模块。

Hey Presto it works. 嘿Presto它的工作原理。

Java EE Module Dependencies seem to be the way to go. Java EE模块依赖性似乎是要走的路。 However, menus names changed in Eclipse Helios: that particular menu is now under "Deployment Assembly". 但是,Eclipse Helios中的菜单名称已更改:该特定菜单现在位于“Deployment Assembly”下。

一个容易犯的错误就是错误地命名WEB_INF下的目录,我把它命名为libs而不是lib,编译得很好但是tomcat会抛出错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在Tomcat上实现Jersey时出现“ javax.servlet.ServletException:java.lang.NoClassDefFoundError” - “javax.servlet.ServletException: java.lang.NoClassDefFoundError” when implementing Jersey on Tomcat 在服务器上运行时,Eclipse - Tomcat - java.lang.NoClassDefFoundError:javax / servlet / ServletConfig - When Run As at Server,Eclipse - Tomcat - java.lang.NoClassDefFoundError: javax/servlet/ServletConfig 原因:java.lang.NoClassDefFoundError:当tomcat / lib下存在类时? - Caused by: java.lang.NoClassDefFoundError : when class exists under tomcat/lib? Servlet给出错误java.lang.NoClassDefFoundError - Servlet giving error java.lang.NoClassDefFoundError java.lang.NoClassDefFoundError: javax/servlet/ServletContext - java.lang.NoClassDefFoundError: javax/servlet/ServletContext 带有Tomcat和axis2的java.lang.NoClassDefFoundError - java.lang.NoClassDefFoundError with tomcat and axis2 java.lang.NoClassDefFoundError响应Hanlder apache tomcat - java.lang.NoClassDefFoundError ResponseHanlder apache tomcat Eclipse,Tomcat,JPA-java.lang.NoClassDefFoundError - Eclipse , Tomcat, JPA - java.lang.NoClassDefFoundError Tomcat 构建错误:java.lang.NoClassDefFoundError - Tomcat Build Error: java.lang.NoClassDefFoundError 如何在tomcat中修复java.lang.NoClassDefFoundError - How to fix java.lang.NoClassDefFoundError in tomcat
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM