在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`
好的,我找到了解决方案。 仔细研究了我的
我发现了这条记录:
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
然后在服务器上运行该项目。