我有一个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
文件。
我不确定这意味着什么。
答案 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.jar
或jsp-api.jar
)是否已在战争中打包?
答案 2 :(得分:0)
根据我的经验,有时验证会使复杂的泛型相关事情变得错误。此外,有时仪器可能会给它带来问题。如果您知道不应出现验证错误,但仍然可以,则可以使用-noverify
启动选项禁用验证。
有时它也因性能等其他原因而被禁用。
有关停用验证的详细信息,请参阅this thread。
答案 3 :(得分:0)
虽然gigadot提到的原因是正确的,但我肯定会在下面的内容之前检查:
cglibs
。 hibernate
版本。如果上述任何一种版本存在多个或相互矛盾的版本,可能会导致意外问题,例如相关问题。