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

时间:2011-02-01 23:14:31

标签: spring spring-mvc maven

我有一个mavenized Spring 3项目,可以在一台机器上构建和运行。 完全相同的项目在第二台机器上构建良好,但是当我尝试点击一个页面(在另一台机器上工作正常)时,我得到以下栈跟踪:

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更新17,而在第二台机器上(项目不起作用),版本是6更新22. pom是完全相同的。

看起来问题集中在自定义标签上,但我无法弄清楚它是什么。可能导致这个问题的原因是什么?

更新

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

  • 在项目不起作用的计算机上,lib目录有el-api-2.2.jar
  • 在项目运行的计算机上,tomcat下的target目录包含以下内容:
`-- 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

项目工作的机器上没有此目录

  • 在项目工作的机器上,war下有target目录,该目录在项目不起作用的机器上不存在(但两台机器都生成{ {1}}目录下的{1}}文件

  • 在构建不起作用的机器上,war文件为4,135,195字节,而另一方面则为4,104,569字节。这种差异来自于包含target文件。

我不确定这意味着什么。

4 个答案:

答案 0 :(得分:1)

根据this answer

  

java.lang.VerifyError可以是   编译时的结果   与您使用的库不同   在运行时。

我建议你在每台机器上编译它并比较war文件中的内容(假设,从堆栈跟踪,你正在建立战争项目)。

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

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

答案 1 :(得分:0)

除了java版本之外,我认为问题是由于Java EE库的版本不同造成的。

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

答案 2 :(得分:0)

根据我的经验,有时验证会使复杂的泛型相关事情变得错误。此外,有时仪器可能会给它带来问题。如果您知道不应出现验证错误,但仍然可以,则可以使用-noverify启动选项禁用验证。

有时它也因性能等其他原因而被禁用。

有关停用验证的详细信息,请参阅this thread

答案 3 :(得分:0)

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

  1. 检查我的类路径中的cglibs
  2. 检查我的类路径中的hibernate版本。
  3. 如果上述任何一种版本存在多个或相互矛盾的版本,可能会导致意外问题,例如相关问题。

相关问题