解决NoClassDefFoundError: org/springframework/expression/spel/support/SimpleEvaluationContext问题

背景

前几天,碰到一个SimpleEvaluationContext类找不到的问题:

异常栈如下:

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/expression/spel/support/SimpleEvaluationContext
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:990) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:472) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:395) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:316) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:395) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:254) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:349) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:175) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_60]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_60]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.31.jar:8.5.31]
	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_60]
Caused by: java.lang.NoClassDefFoundError: org/springframework/expression/spel/support/SimpleEvaluationContext
	at org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$ExpressionResolver.getContext(ErrorMvcAutoConfiguration.java:279) ~[spring-boot-autoconfigure-1.5.13.RELEASE.jar:1.5.13.RELEASE]
	at org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$ExpressionResolver.<init>(ErrorMvcAutoConfiguration.java:275) ~[spring-boot-autoconfigure-1.5.13.RELEASE.jar:1.5.13.RELEASE]
	at org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView.render(ErrorMvcAutoConfiguration.java:225) ~[spring-boot-autoconfigure-1.5.13.RELEASE.jar:1.5.13.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1286) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1041) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
	... 28 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.springframework.expression.spel.support.SimpleEvaluationContext
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_60]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_60]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_60]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_60]
	... 34 common frames omitted

分析

中文资料没找到,于是去google资料,发现是spring-expression版本问题:

我使用的是springboot 1.5.13.RELEASE,eclipse的maven依赖树显示,对应的spring-expression版本是4.3.10.ELEASE。

另一个老外看到的版本跟我不一样,他显示的依赖版本是4.3.14.ELEASE。

最重要的信息来了:

  • SimpleEvaluationContext was added in 4.3.15.RELEASE so the fact you can't find it in 4.3.14.RELEASE is perfectly normal.
  • Spring Boot 1.5.13 uses Spring Framework 4.3.17.RELEASE.

由此可见,由于SimpleEvaluationContext 是4.3.15.RELEASE才增加的,只要把依赖的版本大于这个版本就行了。但由于官方推荐springBoot 1.5.13应该使用spring的4.3.17.RELEASE版本,那就把spring版本升级。

官方文档:https://github.com/spring-projects/spring-boot/blob/v1.5.13.RELEASE/spring-boot-dependencies/pom.xml#L154

解决方案

在pom文件中添加

<properties>
        ...

       <!-- 不把spring-core版本升级也没什么问题。-->
        <spring.version>4.3.17.RELEASE</spring.version>
    </properties>

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>4.3.17.RELEASE</version>
        </dependency>

...

文章结束。

 

<think>根据用户提供的引用信息,用户遇到了`java.lang.NoClassDefFoundError: org/springframework/expression/ExpressionParser`错误。这个错误通常发生在运行时找不到某个类定义,可能是由于依赖缺失或版本冲突导致的。 引用[1]和[4]都提到了`org/springframework/expression`相关的类找不到,引用[3]则提供了一个解决类似错误的例子(通过修改Spring Cloud版本解决)。引用[2]虽然提到了`ServletContext`,但问题不同,可暂时忽略。 解决方案思路: 1. 检查依赖:确保`spring-expression`库在项目中存在且版本正确。 2. 版本一致性:检查Spring相关组件的版本是否一致,避免版本冲突。 3. 清理和重新构建:可能是构建过程中依赖未正确下载或包含。 具体步骤: - 步骤1:在项目的构建文件(如Maven的pom.xml或Gradle的build.gradle)中添加或检查`spring-expression`依赖。 - 步骤2:确保所有Spring组件的版本兼容。例如,引用[3]中通过修改`spring-cloud.version`解决了类似问题,因此可以尝试调整版本。 - 步骤3:执行清理和重新构建命令(如Maven的`mvn clean install`或Gradle的`gradle clean build`),然后重新运行项目。 根据引用[4],错误出现在创建`ApplicationContext`时,这进一步说明可能是缺少`spring-expression`模块。因为Spring框架在解析表达式时需要这个模块。 因此,重点解决依赖问题。以下是详细步骤: </think>### 解决 `NoClassDefFoundError: org/springframework/expression/ExpressionParser` 错误的方法 该错误表明 Spring 框架在运行时缺少 `spring-expression` 核心模块的依赖。以下是系统化的解决步骤: --- #### **1. 添加缺失的依赖** 在项目的构建文件(`pom.xml` 或 `build.gradle`)中显式添加 `spring-expression` 依赖: ```xml <!-- Maven 示例 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.3.18</version> <!-- 需与其他Spring组件版本一致 --> </dependency> ``` **关键点**: - 版本必须与其他 Spring 组件(如 `spring-core`、`spring-context`)严格匹配 - 可通过命令检查依赖树:`mvn dependency:tree | grep "spring-expression"`(Maven) --- #### **2. 检查版本兼容性** 版本冲突是常见原因,需确保: 1. **Spring Boot 与 Spring Cloud 兼容** 参考引用[^3]的方案,若使用 Spring Cloud,版本需匹配: ```xml <spring-cloud.version>Greenwich.SR3</spring-cloud.version> <spring-boot.version>2.1.18.RELEASE</spring-boot.version> <!-- 示例 --> ``` 2. **检查父 POM 继承** 若使用 Spring Boot Starter Parent,确保覆盖版本一致: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.12</version> <!-- 统一版本号 --> </parent> ``` --- #### **3. 清理构建缓存** 依赖未正确加载可能导致错误: ```bash # Maven mvn clean install -U # -U 强制更新快照依赖 # Gradle gradle clean build --refresh-dependencies ``` --- #### **4. 验证依赖作用域** 确保依赖未被错误标记为 `provided` 或 `test`: ```xml <dependency> <artifactId>spring-expression</artifactId> <scope>compile</scope> <!-- 必须是 compile/runtime --> </dependency> ``` --- #### **5. 检查 IDE 配置** - **IDE 缓存问题**:执行 `File > Invalidate Caches / Restart`(IntelliJ) - **部署依赖缺失**:确认构建产物(如 WAR/JAR)包含 `spring-expression-*.jar` --- ### 根本原因分析 此错误的本质是**类路径缺少表达式解析模块**: - `ExpressionParser` 是 Spring EL(表达式语言)的核心接口 - 在解析 `@Value` 注解、SpEL 表达式时触发加载 - 常见于未使用 Spring Boot Starter 的旧项目或手动配置依赖的项目[^1][^4] --- ### 相关问题 1. **如何快速检查 Spring 组件的版本兼容性?** 2. **除了 `ExpressionParser`,还有哪些 Spring 核心依赖容易被遗漏?** 3. **当多个 Spring 子项目版本冲突时,如何高效定位问题?** 4. **Spring Boot 的依赖管理机制如何避免此类错误?** [^1]: 依赖缺失或版本不一致导致类加载失败 [^3]: Spring Cloud 与 Boot 版本需严格匹配 [^4]: 手动配置依赖时易遗漏 `spring-expression` 模块
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值