Struts2启动过程中报错java.lang.ClassNotFoundException完美解决方案

时间:2022-10-21 04:14:36

具体报错部分代码如下

严重: Exception starting filter struts2
java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1275)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1109)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:520)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:501)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4563)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5205)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1404)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1394)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)


可以看到问题出在org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter这句话上

这行代码位于web.xml文件中,用于配置StrutsPrepareAndExecuteFilter,我参考的教程采用的struts版本是2.3.16.3,使用的Tomcat服务器版本是7.0.23

首先排除了eclipse的问题,因为如果是eclipse的问题的话,在编辑代码的时候eclipse就会提示出错。那么应该在于struts或者Tomcat版本问题。

在网上搜索发现这类问题产生的原因主要分为两类:


第一是由于在想WEB-INF目录下导入.jar文件缺失所致。

在导入jar文件的时候应该在文件系统中进行导入,如果直接放到eclipse中可能导致在磁盘中的文件目录下没有导入的jar文件。经过查看,导入文件之后jar是确实存在的,所以应该不是文件没有导入到磁盘中的问题。

再经过检查发现缺少了xwork-core这个jar文件,不过在struts2.5之后,这个文件已经合并到struts-core.jar里面了,所有我遇到的应该不是这个问题。

第二是由于org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter语句在2.12版本前为org.apache.struts2.dispatcher.Filterdispatcher。尝试了两种语句,问题都没有得到解决。

于是尝试将struts和tomcat都重新配置,采用教程中的版本。再次运行,问题得以解决。


不过问题到这里并没有结束,究竟是什么原因导致了这个错误呢。

采用控制变量的方法,先改变服务器版本,发现可以正常运行,再改变struts版本,报错。

那么问题肯定是出在struts上。

上网查询了struts2.5的新特性,终于发现了问题所在,在2.5以上的版本,语句org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter再次发生了变化,其中.ng的部分被去掉了,在eclipse中编辑该语句去掉.ng,变为org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter,成功启动服务器。