Spring java.lang.VerifyError:函数的参数不兼容

Spring java.lang.VerifyError:函数的参数不兼容,spring,spring-mvc,maven,Spring,Spring Mvc,Maven,我有一个mavenized Spring 3项目,它在一台机器上构建并运行良好。完全相同的项目在第二台机器上构建得很好,但当我尝试点击一个页面(在另一台机器上运行得很好的页面)时,我得到以下stacktrace: java.lang.VerifyError: (class: org/apache/jsp/tag/web/generate_002dvalidation_tag, method: _jspx_meth_c_005fset_005f13 signature: (Ljavax/servl

我有一个mavenized Spring 3项目,它在一台机器上构建并运行良好。完全相同的项目在第二台机器上构建得很好,但当我尝试点击一个页面(在另一台机器上运行得很好的页面)时,我得到以下stacktrace:

java.lang.VerifyError: (class: org/apache/jsp/tag/web/generate_002dvalidation_tag, method: _jspx_meth_c_005fset_005f13 signature: (Ljavax/servlet/jsp/tagext/JspTag;Ljavax/servlet/jsp/PageContext;[I)Z) Incompatible argument to function
    java.lang.Class.getDeclaredConstructors0(Native Method)
    java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
    java.lang.Class.getConstructor0(Class.java:2699)
    java.lang.Class.newInstance0(Class.java:326)
    java.lang.Class.newInstance(Class.java:308)
    org.apache.jasper.compiler.TagFileProcessor.loadTagFile(TagFileProcessor.java:635)
    org.apache.jasper.compiler.TagFileProcessor.access$000(TagFileProcessor.java:52)
    org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:685)
    org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1530)
    org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2361)
    org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2411)
    org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2417)
    org.apache.jasper.compiler.Node$Root.accept(Node.java:495)
    org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2361)
    org.apache.jasper.compiler.TagFileProcessor.loadTagFiles(TagFileProcessor.java:703)
    org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:210)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:347)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:327)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:314)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:589)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
我能想到的唯一区别是Java的版本。在项目工作的机器上,版本是6 update 17,而在第二台机器上(项目不工作的机器上),版本是6 update 22。pom的完全相同

看起来问题集中在一个自定义标记上,但我不知道它是什么。是什么导致了这个问题

更新

我查看了这两台机器上的目标目录,并注意到以下内容:

  • 在项目不工作的机器上,
    lib
    目录具有
    el-api-2.2.jar
  • 在项目工作的机器上,
    target
    下有
    tomcat
    目录,其中包含以下内容:
`--雄猫 |--形态 ||--tomcat-users.xml |`--web.xml |--日志 |--网络应用 `--工作 `--本地引擎 `--本地主机 `-- _ |--组织机构 |“阿帕奇 |`--jsp ||——标签 ||`--web || |--generate_002dvalization_tag.class ||`--generate_002dvalization_tag.java |`--WEB_002INF |`--jsp |“--星际飞船 `--SESSIONS.ser 项目所在的计算机上不存在此目录

  • 在项目工作的机器上,
    target
    下有一个
    war
    目录,该目录在项目不工作的机器上不存在(但是两台机器都在
    target
    目录下生成一个
    war
    文件)

  • 在构建不起作用的机器上,
    war
    文件是4135195字节,而在另一台机器上是4104569字节。这种差异来自于包含了
    el-api-2.2.jar
    文件

我不知道这是什么意思。

根据

java.lang.VerifyError可以是 当您根据 与您正在使用的库不同的库 在运行时

我建议您在每台机器上编译它,并比较war文件中的内容(假设,从stacktrace中,您正在构建war项目)

你有没有碰巧在linux和Windowsy上编译过它?在类路径中,您可能有不同版本的相同库。在不同的操作系统上,类的加载顺序是不同的。正确的版本可能首先加载到运行JDK 6u17的机器上


我通常在7zip浏览器中打开war文件,检查是否有任何不同版本的相同库。一些库使用不同的工件名称,但实际上是相同的,例如Springbean和org.springframework.bean。

与java版本相比,我认为问题在于
JavaEE
库的版本不同


这两台机器是否可能有不同的应用程序服务器或不同版本的应用程序服务器?此外,容器提供的库(如
servlet api.jar
jsp api.jar
)是否在war中打包

根据我的经验,有时验证会导致与泛型相关的复杂问题出错。此外,有时检测可能会给it带来问题。如果您知道验证错误不应出现,但仍会出现,则可以使用
-noverify
启动选项禁用验证

有时,由于性能等其他原因,它也会被禁用


有关禁用验证的更多详细信息,请参阅。

虽然gigadot提到的原因是正确的,但在转到其他内容之前,我肯定会检查以下内容:

  • 检查我的类路径中的
    cglibs
  • 检查我的类路径中的
    hibernate
    版本

  • 上述任何一个版本有多个或相互冲突的版本都可能会导致意外的问题,如所讨论的问题。

    我正在linux上编译这两个版本。我将查看war文件,看看是否有任何差异。如果项目相同,我希望相同的maven版本以相同的方式捆绑它们。项目中是否有其他版本的
    el-api
    不起作用?我不知道问题出在哪里,但我建议您尝试从使用任何zip程序都无法工作的war文件中删除
    el-api-2.2.jar
    ,并部署它以测试它是否真的是因为这个额外的库。顺便说一句,请确保执行
    mvn clean
    以确保旧版本中没有遗留任何内容。某些IDE支持maven依赖关系图,您还可以查看
    el api
    的来源。由于
    el
    是JavaEE的一部分,如果servlet容器已经提供了它,那么可能不需要包含它。您只需要在maven dependency中声明要提供的
    el api
    作用域。它们都是JDK SE、EE还是OpenJDK?它们都是从Sun运行JDK的。我从不使用OpenJDK。 `-- tomcat |-- conf | |-- tomcat-users.xml | `-- web.xml |-- logs |-- webapps `-- work `-- localEngine `-- localhost `-- _ |-- org | `-- apache | `-- jsp | |-- tag | | `-- web | | |-- generate_002dvalidation_tag.class | | `-- generate_002dvalidation_tag.java | `-- WEB_002dINF | `-- jsp | `-- starship `-- SESSIONS.ser