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

本文记录了解决Struts2.5版本中StrutsPrepareAndExecuteFilter配置问题的过程,发现2.5版本中该过滤器配置有变动,去掉.ng部分后问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体报错部分代码如下

严重: 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,成功启动服务器。

### Jeecgboot 3.8.0 中 `java.lang.ClassNotFoundException` 错误分析与解决方案 在Jeecgboot 3.8.0项目启动时,如果出现`java.lang.ClassNotFoundException: org.jeecg.JeecgSystemApplication`错误,这通常表明Java运行时环境无法找到指定的类文件。此类问题可能由以下原因引起: #### 1. **依赖项缺失** 如果项目的`pom.xml`文件中缺少必要的依赖项,或者依赖项未正确加载到构建路径中,可能会导致此问题。需要检查是否正确引入了Jeecgboot的核心模块[^1]。 ```xml <dependency> <groupId>org.jeecgframework</groupId> <artifactId>jeecg-boot-starter-core</artifactId> <version>3.8.0</version> </dependency> ``` #### 2. **类路径配置错误** 确保`org.jeecg.JeecgSystemApplication`类位于正确的包路径下,并且已被正确编译到目标目录(如`target/classes`)。如果使用的是IDE(如IntelliJ IDEA或Eclipse),可以尝试清理并重新构建项目以确保所有类文件被正确生成[^2]。 - 在Maven项目中,执行以下命令: ```bash mvn clean install ``` - 在IDE中,选择“Rebuild Project”或“Clean and Build”。 #### 3. **Spring Boot 启动类位置不正确** Spring Boot要求`@SpringBootApplication`注解所在的启动类必须位于其他组件扫描路径的根目录或其父目录中。如果`JeecgSystemApplication`类的位置不符合这一规则,可能导致组件扫描失败[^3]。 确保`JeecgSystemApplication`类位于项目的主包路径下,例如: ```java package org.jeecg; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class JeecgSystemApplication { public static void main(String[] args) { SpringApplication.run(JeecgSystemApplication.class, args); } } ``` #### 4. **运行环境问题** 如果项目的运行环境(如JDK版本、Tomcat版本等)与Jeecgboot 3.8.0的要求不匹配,也可能引发此类问题。请确保使用的JDK版本符合官方文档中的要求(通常是JDK 8或更高版本)[^4]。 检查JDK版本: ```bash java -version ``` #### 5. **打包或部署问题** 如果是通过打包后的JAR文件运行项目,可能是由于打包过程中未正确包含依赖项。确保使用以下命令进行打包,并验证生成的JAR文件是否包含`org.jeecg.JeecgSystemApplication`类: ```bash mvn clean package -DskipTests ``` 使用以下命令检查JAR文件内容: ```bash jar tf your-application.jar | grep JeecgSystemApplication ``` --- ### 示例代码:验证类路径 以下代码可用于验证类是否存在于运行时环境中: ```java public class ClassLoaderTest { public static void main(String[] args) { try { Class.forName("org.jeecg.JeecgSystemApplication"); System.out.println("Class found successfully."); } catch (ClassNotFoundException e) { System.err.println("Class not found: " + e.getMessage()); } } } ``` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值