java.lang.NoSuchMethodError: ognl.SimpleNode.isEvalChain(Lognl/OgnlContext;)Z

本文详细阐述了在将CASmaven项目转换为web应用时,遇到的java.lang.NoSuchMethodError错误的具体原因及解决步骤。通过升级ognljar包版本并删除旧版本,成功排除了问题。分享了对于程序猿来说,发现问题根源并独立解决问题的重要性。

在我整合CAS maven项目转成web的时候,报的其中一个错是:java.lang.NoSuchMethodError: ognl.SimpleNode.isEvalChain(Lognl/OgnlContext;)Z


我从网上查的说ognl jar包版本太低, 我就在pom文件上将2.7+版本的改成了3.0.4.

版本升级后,还是报这个错,我就查ognl-3.0.4.jar包 有没有包含这个类:ongl.SimpleNode,以及方法isEvalChain.——我发现是有的,但是还是报这个错。

最后我到tomcat部署项目webapp下,找到这个项目,进入了web-info , lib中,查看此项目的jar包,发现2.7.3版本的和3.0.4版本的同时存在,我就讲2.7.3版本的删掉了。

——重新部署项目启动后,就没有这个错啦!



小结: 提示的错误就是解决的直接方案,缺什么就找什么。 多找找就知道哪错了, 我之前出现这种错总会找同事同学解决,而今我这种小白发现,找出错误点,才是程序猿最不可缺少的能力,嘿嘿~

<think>我们正在解决一个具体的错误:`java.lang.NoSuchMethodError: ognl.Ognl.createDefaultContext`。这个错误通常是由于OGNL库版本不兼容引起的,特别是在Struts2框架中。根据引用[1]的信息,我们知道这可能是Struts版本与OGNL版本不匹配导致的。 用户的问题描述中提到了`java.lang.NoSuchMethodError ognl.Ognl.createDefaultContext`方法不存在,这也是版本不兼容的表现。 解决方案的核心是确保Struts2和OGNL的版本兼容。根据引用[1]的案例,Struts2.3.16.3需要OGNL3.0.6,而用户可能使用了不兼容的版本(如OGNL3.0)。 以下是解决步骤: 1. **确定当前使用的Struts2版本**:查看项目依赖中Struts2的版本号。 2. **查找对应兼容的OGNL版本**:参考Struts2官方文档或已知的版本兼容信息。 3. **排除旧版本OGNL并引入正确版本**:在构建工具(如Maven)中排除传递依赖的旧版本OGNL,并显式引入正确版本的OGNL。 具体操作: **Maven项目**: 在`pom.xml`中,排除旧版本OGNL依赖,然后添加正确版本的OGNL。 例如,对于Struts2.3.16.3,应使用OGNL3.0.6: ```xml <dependencies> <!-- Struts2 核心依赖 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.16.3</version> <!-- 排除旧版本的OGNL --> <exclusions> <exclusion> <groupId>ognl</groupId> <artifactId>ognl</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加正确版本的OGNL --> <dependency> <groupId>ognl</groupId> <artifactId>ognl</artifactId> <version>3.0.6</version> </dependency> </dependencies> ``` **Gradle项目**: 在`build.gradle`中: ```groovy dependencies { implementation('org.apache.struts:struts2-core:2.3.16.3&#39;) { exclude group: 'ognl', module: 'ognl' } implementation 'ognl:ognl:3.0.6' } ``` 4. **清理并重新构建**:执行清理命令(如Maven的`mvn clean`),然后重新构建项目并部署。 5. **验证**:启动应用,检查错误是否消失。 注意:如果用户使用的Struts2版本不同,需要查找对应的OGNL版本。以下是一些常见的版本对应关系(仅供参考): - Struts 2.3.x -> OGNL 3.0.x (具体小版本需匹配) - Struts 2.5.x -> OGNL 3.1.x 如果用户不确定版本,可以查看Struts2的官方发布说明或依赖关系文档。 另外,如果项目中还有其他库依赖于不同版本的OGNL,可能需要进一步排除这些传递依赖,确保只有正确版本的OGNL被引入。 如果问题仍然存在,可以使用Maven的依赖树命令检查是否有其他依赖引入了旧版本OGNL: ``` mvn dependency:tree ``` 在输出中搜索`ognl`,如果发现其他版本,继续排除。 最后,如果用户使用的是其他方式管理依赖(如直接复制JAR文件),则需要手动替换OGNL的JAR文件为正确版本。 总结:版本不兼容是Java开发中常见的问题,通过依赖管理和排除可以解决。 相关问题: 1. 如何查看Maven依赖树? 2. 如何解决Java中的NoSuchMethodError错误? 3. Struts2框架的版本与OGNL版本如何对应? 4. 在Gradle中如何排除传递依赖? 5. 如何确定一个Java类属于哪个JAR包?</think>### 解决 `java.lang.NoSuchMethodError: ognl.Ognl.createDefaultContext` 版本不兼容问题 此错误通常由 **Struts2 与 OGNL 库版本不匹配**引起。根据引用[1],Struts2.3.x 需要特定版本的 OGNL(如 3.0.6),而错误提示表明实际加载的 OGNL 库缺少 `createDefaultContext` 方法。 #### 解决步骤: 1. **确认当前版本** 检查项目中使用的库版本: ```xml <!-- Maven 依赖示例 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.16.3</version> <!-- 你的 Struts2 版本 --> </dependency> <dependency> <groupId>ognl</groupId> <artifactId>ognl</artifactId> <version>3.0.6</version> <!-- 必须匹配的 OGNL 版本 --> </dependency> ``` 2. **强制指定兼容版本** 在构建文件中显式声明 OGNL 版本(以 Maven 为例): ```xml <dependency> <groupId>ognl</groupId> <artifactId>ognl</artifactId> <version>3.0.6</version> <!-- Struts2.3.x 兼容版本 --> <!-- 排除冲突的旧版本 --> <exclusions> <exclusion> <groupId>ognl</groupId> <artifactId>ognl</artifactId> </exclusion> </exclusions> </dependency> ``` 3. **验证依赖树** 执行命令检查是否仍存在版本冲突: ```bash mvn dependency:tree | grep ognl # 或 Gradle gradle dependencies | grep ognl ``` 确保输出中只有 **ognl:3.0.6** 4. **清理部署环境** 删除 Tomcat 的缓存目录(避免旧库残留): ```bash rm -rf $CATALINA_HOME/work/* rm -rf $CATALINA_HOME/temp/* ``` #### 版本兼容参考表 | Struts2 版本 | 兼容 OGNL 版本 | 关键方法验证 | |--------------|----------------|--------------| | 2.3.x | 3.0.6 | `createDefaultContext` 存在 | | 2.5.x | 3.1.x | 方法签名变更 | | 2.6+ | 3.2.x | 使用 `Ognl.createDefaultContext()` | > **原理说明**:当类加载器加载了不兼容的 OGNL JAR 时,虽然类名相同,但方法实现缺失或变更,导致 JVM 抛出 `NoSuchMethodError`[^1]。 #### 验证修复 在代码中添加版本检查: ```java System.out.println("OGNL: " + OgnlVersion.getVersion()); System.out.println("Struts: " + org.apache.struts2.StrutsConstants.VERSION); ``` 启动时应在日志中看到: ``` OGNL: 3.0.6 Struts: 2.3.16.3 ``` --- ### 相关问题 1. 如何查看 Maven 项目的完整依赖树? 2. Tomcat 部署时如何彻底清理旧版本库残留? 3. Struts2 升级到最新版本需要注意哪些兼容性问题? 4. 除了 OGNL,还有哪些库容易引起 Struts2 版本冲突? 5. 如何通过 Java 反射验证类方法是否存在?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值