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 反射验证类方法是否存在?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值