当前位置: 首页 > 知识库问答 >
问题:

JVMVRFY012:JSTL标记的VerifyError-Foreach

管杜吟
2023-03-14

IBM WAS:8.5.5版本

在JSP页面上有

错误500:java。lang.例外:java。lang.VerifyError:JVMVRFY012堆栈形状不一致;class=com/ibm/\u jsp/\u desktop,method=\u jspx\u meth\u c\u set\u 0(Ljavax/servlet/jsp/PageContext;)Z、 pc=73;

签名org/apache/jasper/el/ELContextWrapper中的参数1类型不匹配:(Ljavax/el/ELContext;Ljavax/el/FunctionMapper;)V与异常详细信息不匹配:

位置:com/ibm/_jsp/_desktop。_jspx_meth_c_set_0(Ljavax/servlet/jsp/PageContext;)Z@73:JBInvokes特殊原因:类型'org/apache/jasper/runtime/ProtectedFunctionMapper'(当前帧,堆栈[8])不可分配给'javax/el/FunctionMapper'

当前帧:bci:@73标志:{}本地:{“com/ibm/jsp/u desktop”、“javax/servlet/jsp/PageContext”、“javax/servlet/jsp/JspWriter”、“org/apache/taglibs/standard/tag/rt/core/SetTag”}堆栈:{'org/apache/taglibs/standard/tag/rt/core/SetTag','uninitialized','java/lang/String','javax/el/ExpressionFactory','uninitialized','uninitialized','javax/el/ELContext','org/apache/jasper/runtime/ProtectedFunctionMapper'}堆栈映射表:append_frame(@128,Object[#127],Object[#231],integer)

在阅读https://www.ibm.com/support/pages/ibm-java-linux-howto-resolving-javalangverifyerror-jvmvrfy012-stack-shape-inconsistent时,要明白原因可能是

  1. 代码是针对与运行时使用的库不同的库编译的
  2. 一个类试图扩展一个声明为最终的类
  3. 一个方法试图覆盖声明为最终的超级方法
  4. 一个错误的参数被传递给一个方法

它看起来确实是#4-但相同的代码在Tomcat中工作,在IBM中不工作,我不确定为什么WAS传递了错误的参数。关于我们如何解决这个问题,有什么建议吗?

共有2个答案

江文斌
2023-03-14

这看起来像javax之间的交叉链接。应用程序中的el库和服务器中打包的版本。上次使用PARENT\u时,应用程序中包含的任何Java EE API都会加载两次,一次从服务器加载,一次从应用程序加载(因为应用程序加载程序不会将该加载委托给其父级)。根据使用中的其他类/包,您可以有一个实例,其中一个类最终直接引用该类的一个实例,并间接(通过其他引用)引用另一个实例,JVM将在该场景中抛出VerifyError。

最简单的答案是:如果您不能100%确定您需要javax的版本。如果在应用程序中删除el类,则不可能出现此特定错误。如果您确实依赖于该版本,那么它会变得更加棘手,因为它可能需要向应用程序添加额外的内容(以避免从服务器获取内容),或者可能是这个特定的库无法在PARENT\u上次加载时被安全覆盖。这种分析需要更深入地研究错误堆栈,可能还需要深入研究类加载的详细跟踪。

凤高翰
2023-03-14

您可能需要探索Servlet/JSP版本兼容性。

was:8.5.5参考

  • Servlet 3.0
  • JSP 2.2

如果您碰巧使用Spring Boot:

  • 2.2。x和2.1。x需要Servlet 3.1
  • 2.0。x支持Servlet 3.0
 类似资料:
  • 我在这里做错了什么: 我一直在 但这很好: 显然我想避免 没有也不行,我的jstl不知道

  • 问题内容: 某些框架(Spring,Tomcat本身)添加了默认情况下无法在EL表达式内使用的Servlet请求属性。一个例子是 因此,为了使用JSTL获得价值,我通常会使用 但是,这不起作用,因为EL解析器希望是对象A的键,并且是该对象的属性(依此类推)。 所以我的问题是:如何逃脱点字符? 我试过使用 但这也不起作用,并从EL解析器中引发错误。 我知道在处理地图时,我可以使用类似 但这不能处理请

  • 我在页面上使用动态包含: 这是标题中的重要部分。jsp: 我的主页源上的结果是: 我用这个: 如果我从另一个页面导入JSTL,有人知道如何使用它吗? 谢谢,佐尔坦

  • JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。 JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。 根据JSTL标签所提供的功能,可以将其分为5个类别。 核心标签 格式化标签 SQL 标签 XML 标签 JSTL 函数 JSTL 库安装 Apache To

  • 我已经在JSP页面的最顶端包含了以下内容: 我已经将JSTL JAR文件放在了目录中。但是,JSP仍然不能解决taglib。我得到以下错误: 找不到“”的标记库描述符http://java.sun.com/jsp/jstl/core” 我正在使用Eclipse Juno,项目结构如下所示:

  • 当加载类时 它遍历构造函数,直到最后到达的类初始化器。 在初始化期间,我得到一个VerifyError: 但以下是: