在Tomcat 7上运行的Web应用程序中的NoClassDefFoundError

我使用由Maven 3构建的gucie-servlet框架用Java编写的Web应用程序。当我在Tomcat 7容器上部署它并尝试使用浏览器访问它时,Tomcat回复404状态代码。 这是来自Tomcat的日志:

Apr 4, 2013 11:39:50 AM org.apache.catalina.core.ApplicationContext log INFO: SessionListener: contextDestroyed() Apr 4, 2013 11:39:50 AM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: contextDestroyed() Apr 4, 2013 11:39:55 AM org.apache.catalina.core.StandardContext listenerStart SEVERE: Exception sending context initialized event to listener instance of class ru.hive.webserver.config.HiveServletConfig java.lang.NoClassDefFoundError: ru/hive/base/db/modules/DatabaseModule at ru.hive.webserver.config.HiveServletConfig.getInjector(HiveServletConfig.java:24) at com.google.inject.servlet.GuiceServletContextListener.contextInitialized(GuiceServletContextListener.java:45) at ru.hive.webserver.config.HiveServletConfig.contextInitialized(HiveServletConfig.java:19) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4797) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5291) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:977) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1655) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:662) Caused by: java.lang.ClassNotFoundException: ru.hive.base.db.modules.DatabaseModule at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1713) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1558) ... 17 more Apr 4, 2013 11:39:55 AM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: contextInitialized() Apr 4, 2013 11:39:55 AM org.apache.catalina.core.ApplicationContext log INFO: SessionListener: contextInitialized() Apr 4, 2013 11:39:55 AM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: attributeAdded('org.apache.jasper.compiler.TldLocationsCache', 'org.apache.jasper.compiler.TldLocationsCache@e8606c') 

exception说在我的应用程序的CLASSPATH中没有名为ru.hive.base.db.modules.DatabaseModule的类,但事实并非如此:

 frodo@shire:~/apache-tomcat-7.0.37/webapps/hive/WEB-INF/lib$ ls -l total 30132 -rw-rw-r-- 1 frodo frodo 4467 нояб. 22 13:46 aopalliance-1.0.jar -rw-rw-r-- 1 frodo frodo 27010023 апр. 4 11:39 base-0.0.42-SNAPSHOT.jar -rw-rw-r-- 1 frodo frodo 232019 дек. 18 10:12 commons-beanutils-1.8.3.jar -rw-rw-r-- 1 frodo frodo 58160 авг. 2 2011 commons-codec-1.4.jar -rw-rw-r-- 1 frodo frodo 196768 дек. 18 10:12 commons-digester-2.1.jar -rw-rw-r-- 1 frodo frodo 163151 нояб. 22 13:46 commons-io-2.1.jar -rw-rw-r-- 1 frodo frodo 60686 авг. 2 2011 commons-logging-1.1.1.jar -rw-rw-r-- 1 frodo frodo 189285 нояб. 28 15:01 gson-2.2.2.jar -rw-rw-r-- 1 frodo frodo 710492 февр. 6 18:59 guice-3.0.jar -rw-rw-r-- 1 frodo frodo 65012 февр. 13 13:21 guice-servlet-3.0.jar -rw-rw-r-- 1 frodo frodo 352585 нояб. 22 13:46 httpclient-4.1.3.jar -rw-rw-r-- 1 frodo frodo 181410 нояб. 22 13:46 httpcore-4.1.4.jar -rw-rw-r-- 1 frodo frodo 26938 нояб. 22 13:46 httpmime-4.1.3.jar -rw-rw-r-- 1 frodo frodo 2497 февр. 6 18:59 javax.inject-1.jar -rw-rw-r-- 1 frodo frodo 31866 февр. 6 18:59 jsr305-2.0.1.jar -rw-rw-r-- 1 frodo frodo 25962 нояб. 22 13:46 slf4j-api-1.6.4.jar -rw-rw-r-- 1 frodo frodo 371816 нояб. 22 13:46 solr-solrj-4.0.0.jar -rw-rw-r-- 1 frodo frodo 520969 нояб. 22 13:46 wstx-asl-3.2.7.jar -rw-rw-r-- 1 frodo frodo 608239 нояб. 22 13:46 zookeeper-3.3.6.jar 

JAR base-0.0.42-SNAPSHOT.jar包含Tomcat无法找到的类。 JAR中的目录结构与堆栈跟踪中的完整类名相同。 我项目的pom.xml是:

   4.0.0 webserver 0.0.42-SNAPSHOT war Api servlet  ru.hive main 0.0.41-SNAPSHOT ../main    dev  true   http://localhost:8983/solr     org.apache.tomcat.maven tomcat7-maven-plugin 2.0  local_tomcat http://192.168.0.39:8080/manager/text /hive true user pass       production  http://localhost:8983/solr/hive     org.apache.tomcat.maven tomcat7-maven-plugin 2.0  production_tomcat http://some.ip.address:8080/manager/text /hive true user pass         ru.hive base 0.0.42-SNAPSHOT   com.google.inject.extensions guice-servlet 3.0   com.google.code.findbugs jsr305 2.0.1   org.apache.solr solr-solrj 4.0.0   com.google.code.gson gson 2.2.2   commons-digester commons-digester 2.1   javax.servlet servlet-api 2.5 provided   junit junit 4.11 test      false  central Maven Repository Switchboard http://repo1.maven.org/maven2   repo  true ignore   false  file://${project.basedir}/lib      never   false  central Maven Plugin Repository http://repo1.maven.org/maven2    hive src/main/java src/main/scripts src/test/java target/classes target/test-classes target    maven-antrun-plugin 1.3   maven-assembly-plugin 2.2-beta-5   maven-dependency-plugin 2.1   maven-release-plugin 2.0      maven-war-plugin 2.3   default-war package  war     true lib/         true lib/     src/main/webapp/META-INF  context.xml  true META-INF      maven-clean-plugin 2.4.1   default-clean clean  clean      maven-install-plugin 2.3.1   default-install install  install      maven-resources-plugin 2.4.3  UTF-8    default-resources process-resources  resources    default-testResources process-test-resources  testResources      maven-surefire-plugin 2.7.1   default-test test  test      maven-compiler-plugin 2.3.2   default-testCompile test-compile  testCompile    default-compile compile  compile        src/main/resources true     target/site   

所以问题是我做错了什么以及为什么我得到这个ClassDefNotFoundexception?

PS。 编辑版的maven-war-plugin配置:

  maven-war-plugin 2.3   default-war package  war       src/main/webapp/META-INF  context.xml  true META-INF     

PPS。 ru.hive.webserver.config.HiveServletConfig类列表

 package ru.hive.webserver.config; import javax.servlet.ServletContextEvent; import ru.hive.base.db.modules.DatabaseModule; import ru.hive.base.state.modules.StateManagerModule; import ru.hive.webserver.api.ApiServlet; import ru.hive.webserver.scheduler.Scheduler; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.servlet.GuiceServletContextListener; import com.google.inject.servlet.ServletModule; public class HiveServletConfig extends GuiceServletContextListener { @Override protected Injector getInjector() { return Guice.createInjector(new ServletModule() { @Override protected void configureServlets() { install(new DatabaseModule()); install(new StateManagerModule()); serve("/api").with(ApiServlet.class); serve("/scheduler").with(Scheduler.class); } }); } } 

购买力平价。 /lib中的JAR列表:

 `-rw-r--r-- 1 jcdenton jcdenton 15264 марта 22 18:38 annotations-api.jar -rw-r--r-- 1 jcdenton jcdenton 54176 марта 22 18:38 catalina-ant.jar -rw-r--r-- 1 jcdenton jcdenton 132729 марта 22 18:38 catalina-ha.jar -rw-r--r-- 1 jcdenton jcdenton 1563926 марта 22 18:38 catalina.jar -rw-r--r-- 1 jcdenton jcdenton 255182 марта 22 18:38 catalina-tribes.jar -rw-r--r-- 1 jcdenton jcdenton 1796326 марта 22 18:38 ecj-4.2.1.jar -rw-r--r-- 1 jcdenton jcdenton 46085 марта 22 18:38 el-api.jar -rw-r--r-- 1 jcdenton jcdenton 123241 марта 22 18:38 jasper-el.jar -rw-r--r-- 1 jcdenton jcdenton 599131 марта 22 18:38 jasper.jar -rw-r--r-- 1 jcdenton jcdenton 88690 марта 22 18:38 jsp-api.jar -rw-r--r-- 1 jcdenton jcdenton 177599 марта 22 18:38 servlet-api.jar -rw-r--r-- 1 jcdenton jcdenton 6873 марта 22 18:38 tomcat-api.jar -rw-r--r-- 1 jcdenton jcdenton 795308 марта 22 18:38 tomcat-coyote.jar -rw-r--r-- 1 jcdenton jcdenton 235411 марта 22 18:38 tomcat-dbcp.jar -rw-r--r-- 1 jcdenton jcdenton 77364 марта 22 18:38 tomcat-i18n-es.jar -rw-r--r-- 1 jcdenton jcdenton 48693 марта 22 18:38 tomcat-i18n-fr.jar -rw-r--r-- 1 jcdenton jcdenton 51678 марта 22 18:38 tomcat-i18n-ja.jar -rw-r--r-- 1 jcdenton jcdenton 123958 марта 22 18:38 tomcat-jdbc.jar -rw-r--r-- 1 jcdenton jcdenton 23174 марта 22 18:38 tomcat-util.jar` 

好的,我找到了解决方案。 仔细研究了我的/logs/catalina.log我发现了这条记录:

 Apr 5, 2013 1:38:26 PM org.apache.catalina.loader.WebappClassLoader validateJarFile INFO: validateJarFile(/home/frodo/apache-tomcat-7.0.37/webapps/hive/WEB-INF/lib/base-0.0.42-SNAPSHOT.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class 

这个问题解释了这个消息的原因 – 我的JAR base-0.0.42-SNAPSHOT.jar包含与Servlet API相关的东西,因此不能由Tomcat加载。 因此,我的网络应用程序在启动后无法在此JAR中找到类。 我在这个JAR中使用了一些Twitter公共部分,其中包含Servlet API的实现。 修改base-0.0.42-SNAPSHOT.jar的依赖项后,我的应用程序启动并加载所需的类。 谢谢大家!

根本原因可能是maven-war-plugin已被配置为

    true lib/    

上面的配置用于创建Skinny WARs ,它将all war libs引用到ear/lib

请尝试从maven-war-plugin配置中删除所有这些内容。 然后再次构建并部署到Tomcat。

我希望这可能有所帮助。

复制文件

  • com.sodius.mdw.core.jar
  • org.eclipse.emf.common。* version_name.jar
  • org.eclipse.emf.ecore。**。jar子
  • org.eclipse.emf.ecore.xmi_2.9.1.v20130827-0309.jar

在您的ServletProjectName/WebContent/Web-INF/lib

我已经通过在Eclipse中将Tomcat服务器添加到Java Build Path来解决了这个问题。

右键单击项目 – > Build Path – > Configure Build Path – > Add library ..(出现在对话框的右侧) – > Server Runtime – >选择“Apache Tomcat v ..” – > Finish

然后在服务器上运行该项目。