Spring java.lang.VerifyError:函数的参数不兼容
我有一个mavenized Spring 3项目,它在一台机器上构建并运行良好。完全相同的项目在第二台机器上构建得很好,但当我尝试点击一个页面(在另一台机器上运行得很好的页面)时,我得到以下stacktrace: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
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
- 在项目工作的机器上,
下有一个target
目录,该目录在项目不工作的机器上不存在(但是两台机器都在war
目录下生成一个target
文件)war
- 在构建不起作用的机器上,
文件是4135195字节,而在另一台机器上是4104569字节。这种差异来自于包含了war
文件el-api-2.2.jar
我通常在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